Initial implementation of the Snapshot API

This is a first stab at the new Snapshot API, `serializer.serialize()` now receives a Snapshot instead of a record instance.

- **Caching** - Right now, attributes are cached eagerly (on instantiation) and relationships are cached on first access. Is this the design we want?
- **snapshot.belongsTo()** - Returns a new snapshot (with at least an ID) or undefined. Is this what we want or should we always return a new snapshot?
- **snapshot.hasMany()** - Always returns an array.
- **snapshot.get() deprecated** - To only use `attr()`, `belongsTo()` and `hasMany()` would require some work in serializers. Should that be done in the scope of this PR or separately?
this.constructor = Deprecate and return record.constructor (defineProperty if available and if in dev mode, else just set it)

Also set this.typeKey