I wonder if we should define `hash` and `isEqual:` methods on GCMItem. Without them, I think this is equivalent to  pointer comparison. In current practice, I imagine that it will actually be the exact same instance being passed around, but that seems like a poor assumption for general use.