Error handling

WIP - Not ready for merge

- [x] write default error handler
- [x] make sure custom error handler defined with `handle_error(...)` are invoked first so they can cancel out the default error handler if they want to
- [ ] make route handler be regular middleware
- [x] update example app
- [x] documentation
- [ ] tests would be sweet