Streaming rpc

Here it is, the streaming RPC changelist!

I spent a long time cleaning it up into as few independent changelists as possible, and I hope it's readable for you.

Not at all.  The code is only a tiny bit longer, and that's so we can keep both the old and new behavior.  I didn't inline anything!