move where perform work happens.  It was happening before we transitioned from processing_started to either processing_idle or processing_waiting depending on what has_calculations returns.  Now instead, we'll perform work when we transition into processing started, then decide where to go after that.

re-write the dependent_calculations state machine.  It now is idle/started/waiting.  When we started, we queue up the calculations, then change the state to "started".  When we come to the started state, we check to see if we are done (no work or we finished it all) and go back to idle.  Otherwise, we go to the waiting state and wait for all the dependent calculations to finish.  We now count finished as "cancelled" or "completed" and we will wait for all the dependent calculations to reach one of these states.  There is no "cancelled" so just stop - if we queue the work, we have to wait for it.
- tests for queuing a new run at various points in processing.  Ensure that we always go back to an idle state
- fix and unpend the should cancel test