A bit of tidying up

Separated classes out into their own files and made more things internal
Support eager loading

By passing a property path into the Include method, the user can specify
that these properties are loaded all at once, rather than one at a time
when they are accessed