Factor out first/last times from message stores.
Split message stores out into their own file.
Surface errors from storage interface.