Refactor field rendering code

Separates each field type into it's own subclass, in order to keep the rendering logic for the field encapsulated in one place.