Bug 1109772 - Refactor data access API. (WIP)

This'll be a non-trivial bunch of work. I'm still hacking away, trying to get the abstractions right. Starting with bookmarks.

Pull request here for clarity; do not merge this yet.
What happens if it fails? We show an empty cell? Shouldn't we work with a consistent  snapshot of the data so that it is impossible to fail?