Refactor some logic into Entry and Value classes

This moves some logic out of the main lib and into the Entry and Value classes. An Entry represents an individual item from the list of keys given in the hash parameter passed to .super_serialize. Values represent default values and can validate future values against the type of the default.