Blocking primitives (sync)
- sender blocked until message recv
- recver blocked until message arrived
Non-blocking primitives (async)
- sender resume op after sending, donneed wait for recv
- recv receives msg if avail / indicates msg not ready, continue
- not truly async, sent messages are buffered. When buffer is full we have to wait for buffer to flush before we can send again.