another massive change to split apart the dispatcher into the dispatcher and the performer

- dispatchers now only take the intent and return a callable of (dispatcher_top, box) -> None
- also fixed a bug in perform_stubs so it wouldn't perform effects returned from callbacks of children of parallel effects (!)
- also refactored perform_stubs to be recursive