This version uses nonblocking operations for both sending and receiving;
primarily, this is to handle the buffering issues. This case posts the
receives first, allowing eager delivery to often avoid copies (but without
guarenteeing that).
A separate example shows the use of nonblocking operations to express the
overlap of communication and computation.