Tidying up authorization handling

Simlify a bit by using EitherT in processAuthorizationRequest.
Restructure authorization request error types

Failure condition is now an AuthorizationRequestError rather than
EvilClientError. This allows most of the code to run in EitherT and also
allows for other outcomes rather than just a redirect or an error. In
particular it will be used to handle the case where a max_age parameter
is included in the request and the user needs to be re-authenticated.