New ErrorHandler middleware.

This middleware catches exceptions, logs them, and then re-executes the request to generate an error page. The request can be re-executed down the original pipeline with a modified request path, or down an alternate pipeline.  If anything goes wrong generating the response then the original exception will be re-thrown.

The re-execution will not be attempted if the response has already started.

@loudej @davidfowl @Eilon 
I think clearing all response headers would be best. If there are some headers added by middleware that you do not want cleared then that can be managed by pipeline ordering (e.g. put the error handler before those middleware and they will re-execute and re-add the response header).