Commands

Fixes #42 

I still need to add more Command+Consumer specific tests, but this has so many changes in it I'd prefer to merge this ASAP.
Would it be simpler to have the Consumer's runloop stop calling coord.Claim() or coord.Watch() during a freeze?  That keeps the coordinator's interface a bit simpler.   Plus, if we unfreeze the coordinator it will just pick up unclaimed tasks issued during the `freeze` window.