Local implementation of WorkflowOperations behaves more like SWF.

Multithreaded cancelable retries were needed for retries with arbitrary max attempts so that they are not able block workflows in unit tests that retry forever (or until a time out).
The workflow now waits for all forked work to be completed, so that asserts in a unit test have their final results.
Scoping of tries and retries was needed so that nested work can be analyzed for completion.
Exception handing for tries and retries now propagates like SWF.
Add descriptions to Promises that explain what they are doing.
Add ability to see the history of timers and the scope hierarchy for debugging unit tests.