cleanup for the internal plugin infrastructure

- Introduced the `JvmPlugin` wrapper (to add additional internal functionality to the plugin)
- fixed `hashcode()` on the `PluginInfo`
- extracted the `PluginsInfo` caching logic to `CachableReference` construct in utils
- cleaned up the `PluginsService` class to make the logic there more structured/understandable