Fields now cache the results of an `evaluate` function and store it under $fieldName, e.g.: a model with a field `parent` would have a lazily-evaluated model available at `$parent`.
Field getter calls return the result of this[$fieldName].
Field setter calls will rebind the value of `evaluate` to `this[$fieldName]` and will update the model's data.

Cleaned up the BaseModel a bit and continued the work of namespacing essential methods and providing overridable methods.