Offline sync

@matthew-andrews @commuterjoy 

Basic (probably not very efficient) implementation for now:
- when a put/delete request fails, we save that object to a new localStorage list for pending items.
- When the initial fetch succeeds, we then re-request those items