For allowing developers to easily upgrade the boilerplate in case of an issue inside the code, it would be interesting to separate the logic related to wiring the logic from features from the kernel booting the plugin aka the Plugin class.
For that my proposition would be to create a new class type, the provider, that registers some services, delegates, shared_instances, bindings and arguments and then pass them to the Plugin class.
That way we would not be anymore hardcoding them inside the Plugin class and we would decouple these two parts.
For the same reason that it would be interesting to pass the providers to the Plugin class constructor as an array to prevent coupling the plugin class to the providers themselves.