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?
@fivetanley @stefanpenner `members` is a `OrderedSet` so `members[i]` doesn't seem to work.

Should i use `Ember.ArrayPolyfills.forEach` directly or `Ember.EnumerableUtils.forEach`? Or just rely in the existing `Ember.OrderedSet.forEach` ?