Called by the state engine to perform an action
before a state transition takes place. The FSM is
passed so that the Action may set the next state in
cases when that is required. FSM and Input together
allow actions to be written that depend on the state and
input, but this should generally be avoided, as the
reason for a state machine in the first place is to cleanly
separate the actions and control flow. Note that an
action should complete in a timely manner. If the state machine
is used for concurrency control with multiple threads, the
action must not allow multiple threads to run simultaneously
in the state machine, as the state could be corrupted.
Any exception thrown by the Action for the transition
will be propagated to doIt.
FSM - fsm is the state machine causing this action.
Input - in is the input that caused the transition.