Hi Matt,
Glad to hear others are experimenting with message-based systems! I did some work together with Moritz on the zmq egg and I wrote the nanomsg egg.
The main reason I wanted to try nanomsg was that it offers
Level-triggered Polling. This allows us to do thread-wait-for-i/o on a nanomsg-socket, waiting for a message while other Chicken threads are running. We couldn't solve this with zmq because the zmq_poll C call (just like all C calls) would block the Chicken world. Nanomsg is also smaller than zmq, and written in C, which makes it a little more manageable I think. Creating bindings for nanomsg was a breeze.
Problems with nanomsg is, of course, that it has a smaller community and is much less tested etc. We are still just about to test if nanomsg can solve some of our IPC needs for a commercial project.
When it comes to memory management, it's tricky. I recommend you do like Thomas Chust suggests: have zmq allocate message, copy into Scheme object, free zmq message. Perhaps not the fastest, but it's correct and relatively easy to get right.
Keep us updated on your messaging adventures!
K.