Allow Collections to determine uniqueness, not Models

Here's the approach from the other side. Tim made some good points regarding who should be determining uniqueness in #3080. With this setup, collections will never care about `model.id` and bookkeep purely by a customizable `Collection#generateId`. This means models can be in many collections and uniquely identified appropriately across all of them, all without having to alter the data in the model. After all, a model can't know how to distinguish itself from others in a collection as well as the collection can. This is a first draft, but I feel this may be the better way.

RFC @jashkenas @braddunbar @tgriesser

RE: #2976, #2985, #3080, #3132
We should probably also check `attrs === existing` here as we don't need to set a model with it's own attributes.