Expose coprocessor environment as concrete subtype.

This lets us see what region we're attached to.
Publish put and delete events to the inproc socket.

Our messages are 3-tuples, composed of a table name, a type code ("P" or "D") indicating the operation, and the serialized operation itself.

We take advantage of a ZMQ feature called multi-part messages, which let us pack three physical messages together into one atomic whole (for the purposes of delivery.)  This saves us from having to pack byte arrays.

In a PUB socket, only the first part of a multi-part message is considered when filtering topics: we opt to make table names our (sole) topic space.

On the receiving end, we will still need to make 3 receive calls to retrieve all three parts of each message, but we're guaranteed that if the first part arrives the other two will be waiting.

See http://www.zeromq.org/blog:zero-copy for more details.