Enforce HTTP error handling, add metrics and revamp timeout handling

While Investigating timeout problems, I have refactored much of error handling to get more precise errors and metrics. Lots of errors from the `ClientActor` were not forwarded to the actual client, causing a timeout instead of an error message. Real HTTP timeouts are now caught and trigger an HTTP 500 response with a custom message.

I have also removed some application-level timeouts (not related to transport) in `ForwarderActor` and `ClientActor`, as they handled very unlikely errors, complicated the logic, and potentially created errors themselves. For example, the `ForwarderActor` used to timeout before the `ClientActor` receives an HTTP timeout.