Refactor canonicalization from middleware

This means we:
  * don't need to create RequestContext twice
  * don't need to have two different (and potentially confusing) contexts in
    which RequestContext is used
  * don't have the (small) indirection of middleware
  * don't overwrite the original request information - we will be able to access the
    original URL and fix a bug with 410 TNA links which requires that data