Add Model.typeFromSnapshot for polymorphic records

This breaks Store#findOne because this returns a record which is then
thrown away when we lookup the polymorphic type.

We can fix this completely by returning an ObjectProxy instead on finds.
WIP - Return PromiseProxy from finds

This has the potential to be confusing as the proxy won't support #save etc... you'll
have to know to drop through to the proxies content to save etc...

More confusion because the proxy isn't put in the cache, the underlying record is.
So a 2nd call to find will return an actual record and not a proxy!

Can we unwrap this when it's resolved? Not if it's been assigned to something.
Indexed collection could replace the record in its cache when it's resolved?

If we had method-missing then all would be fine, as the issue comes when calling
functions on the proxy/record. We could implement methods on the proxy for the 
common functions (save, buildFirebaseReference etc...) and forward them to its content
but that's going to be very confusing if you add your own methods!
remove incorrect comment
PromiseModel forwards functions to its content
always return a promise model from findOne
set PromiseModel content immediately if promise has resolved
Don't lookup the model class in indexed collection if we don't need it yet
Fix hasOne detached with custom item ID function
Only remove observer if we've satisfied the requirements
Fix double-wrapping when adding a meta model to collection