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.

No, it's used in RPC handler - we only print when there's an error, but I fixed `toString()` for the non-error case anyway!