Volume management WIP

First pass on volume management API with an initial ZFS implementation.

Note: this is not at all final and not targeting master.  Some interfaces are not yet complete, and some are in fact just documentation indicating the direction they're expected to go.


Yeah, I agree with the idea of making these as loosely coupled as reasonably possible.  How should we express that exactly?

What's occuring to me right now is: add a method to `host.ActiveJob` that accepts `(*Volume, mountpath string)`.  I don't know how to make it work without exposing the base mount point of the volume to the host package though.

Making `func (*Job) Mount(*Volume, mountpath string)` into a little interface of its own in the volume package that ActiveJob just happens to implement would make it possible to test the final mounting phase of volumes without involving full jobs and containers on the rest of the host system.  Not sure if that's a win, or if that's just going too far and it's as well to leave that to integration tests.

Although I'm also not sure ActiveJob is the correct type to attach such a method to, because it seems like so far it tends to be a fairly passive data carrier.  Maybe it belongs on the backend interface instead?