First cut at tight error handling.

When an error occurs, we collect the details, and then self-signal the workflow with the error details.

TODO: FSM should notice error event markers and use the ErrorHandler appropriately, perhaps transitioning to a (canned?) error *FSMState that knows how to
deal with the signal