Big, big update.
- One major change is that ProtocolBlock no longer contains the list of transactions that come with it.
--- This is so that we can treat each "new block!" message the same as a "new block header!" message, and allow transactions to come in separately.
- Related to the above, the temporary hacky code now loads all the block headers (LIGHTNING FAST) before requesting the full blocks.
--- Before, CPU utilization was occasionally pretty good, but it was still limited to a maximum of 500 blocks' worth of transactions at a time, a number which decreased as we worked our way through each window.
--- Now, once we get all the headers, it's a lot simpler to just validate more transactions in parallel, because unlike before, we can request any sequence of 500 full blocks that we want!
- Removing the "coinbase" value source from blocks.  It's no longer appropriate.
- Adding a concurrency-aware class called "Waiter<T>".
--- Consumers can use this to wait on past, present, and future events keyed by some value, currently always BigInteger.
--- Producers can signal all present and future waiters.
--- Race conditions should be completely eliminated.
- Temporarily making the in-memory chain store the one that we use.
--- Wanted to check this in as soon as I can.  I've been holding onto most of this work since my last check-in, and I'm getting anxious.