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.
It can fail, which is why it returns an optional.

But this kind of failure is why I'm tucking much of this logic down into the bookmarks model: in theory, once ownership of the data is encapsulated like that, we can make sure that changes happen in lockstep, and we can reverse the `refreshData` channel to be a little more like observation.