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.

Absolutely.  However, the behavior of the code is unchanged - it did this originally.

Here's the issue.  The original toJson method was const and it didn't try to recalculate that hash.  I simply brought it out as a const helper function - and then I realized this issue.

Unfortunately, at least one of the call sites intrinsically has the ledger as const, so a non-const function won't work.  I thought of making the hash and `mValidHash` mutable - but I don't think that's a good idea in code that might be called from multiple threads.  So I left it just as it was.