This interface must be implemented by any class that is used as a state in a FSM. The FSM only needs the identity of
this object, so all that is really needs is the default equals implementation. The toString() method should also be
overridden to give a concise description or name of the state. The StateImpl class handles this.
Pre- and post- actions are taken only on completed transitions between different states. Assume that the FSM is in
state A, and the FSM will transition to state B under input I with action X. If A != B and X completes successfully,
then after X completes execution, A.postAction is executed, followed by B.preAction.