MDM Batching (Merged)

This is a pretty neat MR to add batching to the MDM. Previously, every single instruction would get its own packet when streaming results of a program to the caller. We originally did this so that there would be at little latency as possible when performing multiple operations.

Now, depending on the next instruction, the MDM may choose to wait to batch them. If the next instruction is very quick to execute, the next instruction will be added to the current batch of instructions. This chains, so you can end up with dozens of responses being batched together.

We added this optimization specifically for Skynet lookups to support K-of-N files. Before this optimization, asking a host if they had 30 different roots would have resulted in 50kb of responses, which is not bandwidth efficient. After this optimization, the host will only need to send 1.5kb of response for the same query. Because this is a general optimization, other programs will benefit as well.