Add HasPluginInfo "duck-type" interface

This interface is very similar to Contextual and Prioritized, in that it
provides optional functionality which will be automatically functional
if a PluginService#createInstance(s) method is used to instantiate the
plugin. The interface provides an explicit linkage between the plugin
instance and its metadata, which would otherwise be unavailable without
an O(n) search (where n is the number of plugins of that type).
PluginInfo: always inject priority & plugin info

The PluginInfo#createInstance() method exists in a context-free vacuum,
so cannot inject the Context in the case of the object implementing
Contextual. However, it *can* inject the priority in the case of a
Prioritized object, and the PluginInfo (i.e., itself) in the case of a
HasPluginInfo object. Doing so is not expensive, so we always do it now,
for convenience.

Note that because PluginInfo cannot inject the Context, though, it is
still best practice to call PluginService#createInstance(PluginInfo)
rather than using the PluginInfo#createInstance() method directly. That
way, the Context will be inject correctly as well.