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.
Can this fail? What if this code is executed at the same time as a sync session and that indexPath.row does not exist anymore? Should this code work on a snapshot of the data? Or is it already doing that?