Simplify Sharing Client State Machine
Old State Machine New State Machine
In addition, the error state should be eliminated. If an error occurs, we send an abort message, clean up the external state (for example, unshare the group), and return to the start state (with the abort message's ID as the previous message ID). If we get an abort message, we clean up the external state and return to the start state. We don't send an abort message in response, otherwise we'd get into a loop.