Email subject typo

Previously, there were no spaces between different time parts (diff) in the email subject. This pull request refactors subject compilation out into a separate class, adds some basic tests, and uses that in the UserMailer instead.