@andyberry88: Can you merge if you are you happy with the idea that Plugin.instanceOf() should always work?

1. Stopped throwing an exception if Plugin.instanceOf() is invoked on a
non VirtualProxyPlugin instance since this violates Liskov's, and makes
external code harder to write.
2. Moved the implementations of Plugin.instanceOf() and
Plugin.getPluginClass() to a central AbstractPlugin class, so that we
don't have all the duplicated code everywhere.
3. Finally, added an equals() implementation to Plugin, so that equals()
works in all four combinations between plugins and virtual plugins
(previously only worked in 3 of 4).