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 idea, this was what was originally there (the `std::dynamic_pointer_cast` was moved from another file but I didn't write it).  I wondered what was going on myself, I've never seen `std::dynamic_pointer_cast` before...