added decoder tests.
changed the names of some of the fields in FieldModelBuilder to be more closely aligned with what is happening.
added Lazy<T>, Factory<T>, LazyCodec<T>, and tests.
changed cycle detection to use a lazy codec instead of throwing that cycles aren't allowed.