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.
This is actually getting a little hectic.

When should that close actually apply?  Since the `persist()` is kicked off in a goroutine, it might attempt to apply its update to the boltdb *after* the test method returns... which means with a deferred cleanup, it's going to blow up on nil/closed file.

- Option 1: use the reporting channel and account for every single persist call.  Workable; very fragile.
- Option 2: allow the db to be closed at any time, and check for nil/closed before attempting to do work in `persist()`.  Workable, but requires `stateFileMtx` to come back.
- Option 3: rethink whether it's really useful for `persist()` to happen out-of-flow.

Preferences or fourth options?