Added `sync` and `message` keywords to Request.communicate().

Request.communicate(sync=False) allows us to send request messages to the
server without blocking for a response.

Request.communicate(message=...) allows us to send an alternate message than
the one the request would have generated itself, and then to block until a
response is received matching the sending request. This is particularly useful
when building up an OSC bundle where (for example) the final message in the
bundle is a /sync message. If the sending request is the SyncRequest which
generated that /sync message, the request can handle both sending the bundle
rather than a lond /sync, and then block until the server replies with its own
/synced response.