Use fetch to make exception more informative

If the key doesn't exist, then we'll try to call [] on nil. By using
fetch, it's obvious what key doesn't exist.
Allow setting session with an expiry

setnx only sets the value if the key does not exist. That prevents us
from changing a user's session.