Move macro code to a separate module

This separates the compile time code from the run time code.  I think
this will make maintenance easier.
Refactor accessor macro expansion

This paves the way for defining other kinds of accessor predicates.
Implement field/2 accessor

This isn't really an accessor since it doesn't "access" anything.  It
really just declares that a struct has a given field.  It can also be
useful for iterating all of a struct's field names.
Implement modifier predicates

There are two dynamic modifier predicates (in which the field name is an
argument): field/4 and field/5.  There are also two static modifier
predicates for each field (in which the field name is the functor).