Rework the whole DB code into something more useful

A bit of a drag, but I like the API much better now.

There's a single abstraction for map-style operations, as bundled up in
the DB type. This means that the Patricia Trie and the underlying
database can implement the same interface, which is handy. (And both can
be swapped with the map-based version for testing.) Also, the
state-monad-based Trie eliminates the manual passing-around of the
trie's root hash. (Except for the internal implementation, where that's
exactly what you want.)
A little more work on the block protocol

Getting a better sense of how this works. Code for part of the
transaction validation and a little cleanup.
A handful of new message definitions for the wire protocol
Sidetrack - rewrite some of the RLP helpers

I was writing some RLP conversions that really shouldn't have needed to
be done manually, and it's way more fun to do this generically.

We now wrap the to- and from- conversion functions in a struct. This
makes it easier to operate on both consistently, like by adding 'tags'.
The code can now derive two different representations -- one general one
where constructors translate to products (without special-casing the
single-element constructor) and another that only compiles for
single-element constructors (or sums thereof) and keeps everything
unwrapped. This makes things more explicit when we're relying on
something unusual, but without a lot of boilerplate. Alright!
Finish the data types for the wire protocol