Transitions only happen when the underlying message operation was "completed." For messages sent asynchronously, this means sent over the wire (resp., received). For messages sent synchronously, this means sent over the wire ''and'' replied to by the other side (resp., received and reply sent).
We can support sending/receiving multiple messages per transition. As this complicates the implementation, it's probably best to add that only when necessary.
'''TODO''': there are many things we can integrate here, but concrete use cases are necessary. This should be a main point of discussion.