Introduce new filter API in Global that works for any Handler

Introduce a new filter method in `Global` that works for any `Handler`:

```
def doFilter(next: RequestHeader => Handler): (RequestHeader => Handler)
```

It allows to filter at a higher level that the current `doFilter`, for example to filter WebSockets.

This pull request also contains some refactoring that moves out from the core the low level routing, request tagging and filtering tasks. These tasks are now defined in the Global object in `onMessageReceived(rh: RequestHeader): (RequestHeader, Handler)` and can be overridden by the application or by a plugin if needed.