App: use trait for errors
There is a big match block in
fn dispatch_error to handle all error cases, which are modeled with a big enum with many variants. Since there is an error case for each request, this can be changed to isolated data
structures that implement a common trait. Done this way, extending and modifying existing error cases becomes easier. Moreover, there is no need to check among so many variants and then run the proper piece of
code; traits pass a pointer directly to the function.