Host state database

Converts the host state persistence system to use boltdb instead of a json flatfile.  Fixes #532.

Changes to state of a job are now updated individually, rather than requiring complete reserialization of all jobs.
I'd go with an optional method on the backend to request an opaque `[]byte` for a given job id, and another optional method to request the same for the global internal backend state.

Namespacing isn't important, we can just nuke the state when the backend changes since it will require a restart (can just save the backend name in a key and nuke everything if it doesn't match).