Add Identifiable interface
Make ModuleInfo implementations also Identifiable

In particular, this makes it easier to distinguish between multiple
modules with the same delegate class in an extensible way, since any new
ModuleInfo implementations can choose to override the implementation of
Identifable#getIdentifier() to properly differentiate themselves.
Merge branch 'identifiers'

This branch introduces the Identifiable interface, which allows objects
to provide a string identifier that differentiates them from other
similar objects. The initial use case is for use with ModuleInfos, but
it is a duck-type interface which can be added to anything as needed.

See the Identifier javadoc for more details.