rework message sending

the proxy stuff wasn't behaving with memory management predictably enough.

this tightly constrains things, plus it's a lot more debuggable and understandable