Return user objectwith self.current_user

This cleans up the codebase by returning a user object for self.current_user instead of just the email. Almost every instance of the call was just instantiating a user object anyway, so this makes that boilerplate. It also allows the base template to automatically get user info and level for rendering.
Sorry, to clarify, your previous comment was that anything can be returned as long as not logged in is `None`. The underlying code for authentication that you linked does not actually work that way. If a `User` is going to be returned, we need to make sure it works as expected, without side effects, with the underlying code. The form the underlying code is using is:

```python
if foo:
    # do stuff
```

My guess is that a `User` object will always evaluate `True` here regardless, but I do not know if that is correct: does an instance of a `User` object mean that we have a valid user?