Interface representing the identity of an individual domain object instance.
As implementations are used as the key for caching and lookup, it is
essential that implementations provide methods so that object-equality
rather than reference-equality can be relied upon by caches.