Model jobs as finite state machines

Jobs are represented as finite state machines with a current state
and a collection of transitions. Each transition manages a
collection of subscribers that are notified whenever the job
successfully undergoes a state transition.

Next: set up queue to actively push events to jobs.