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 
How about `"An unhandled exception has occurred: " + ex.Message, ex);` - and have that be the first thing logged unconditionally?

Then the second thing to log would be `if (responseStarted){}` but it should be a WriteWarning severity only, and probably doesn't also need to have the `ex` passed to it.

That way someone looking at the logs can look for the same Error no matter if the page wrote data or not