Run executed the finite state machine with args of any type and start as the first state.
It keeps executing the states until the current state is nil. In case a state returns an error,
the execution stops and the error is returned.
State represents a state in the finite state machine.
It takes args as a set of arguments and returns the arguments for the next state,
the next State to run or an error.
Returning a nil State indicates the successful end of the state machine.