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 gives us (and end users of Ember Data) much better stack traces and profiling information when the function form is used.