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.
Compiler complained. You can't use a `protocol` everywhere you can use a `class`.