Fully async state machine implementation for C#. The states are properly guarded for the entire transition.