Convert from array based field storage to hash based, store extension fields in same bucket

Extension fields are now stored in the same bucket but we select them
out if you really want them. `get_field` returns only non-extension
fields based on tag or name. You can pass true as a second argument to
get any field regardless of extension or not (similar to passing true
to respond_to? to check for private methods). `get_extension_field`
returns only extension fields based on tag or name.
Remove instance level field getters, self.class ain't that far away