refactor(*): add JobWatch and track machine heartbeats

* JobRequest objects yield JobWatch objects
* A JobWatch object tracks a single JobPayload and a Count. A Count value of -1
  represents the need to run a Job with the contained JobPayload on every host. A
  value other than -1 represents the need to run a specific number of the contained
  JobPayload across the cluster.
* A user of corectl may pass a --count flag to set Count to something larger than 1
* EventMachineUpdated events are now emitted when an Agent heartbeats. This is
  used by the Dispatcher to track an up-to-date list of machines.