Split message class into modules, use hash storage for fields

In an attempt to make the message class easier to grok, I'm trying to
pull similar methods into different modules that can then be included or
extended. This is really a work in progress to see if others can verify
that it does indeed make things easier to understand.

I want a cleaner separation between the DSL that generated classes use
(extensions, optional, repeated, required) and the field storage
getter/setter stuff. I'm not there yet, but open to suggestions. Also
note that the instance methods for getting fields are still in the
message class, which is weird.

All specs passing at this point.