Separate code generator logic from abstract generator algorithm

Now we can specify "plugin" code generators, but still have a default Erlang
generator available
Do not generate message code when there are no fields

This is actually a necessary modification, otherwise having a message with no
fields will generate code that won't compile. This is because the encode/decode
and mget/mset functions expect field-specific functions to exist, but they won't
if a message contains only, say, enums and no fields. It's an odd, unlikely, but
valid scenario for a message.