Feature: Improve add-on init dispatch

Handle different add-on `init()` signatures in a generic and type safe way. An adapter is selected at compile-time based on the signature of the init function. The adapter is stored in the module struct. At run-time the adapter unpacks the users init function and provides the requested arguments.

This is related to #8802.
Hehe... yeah. I though so. I kind of wrote it for fun. Then it was so much cleaner and way more expressive... almost like a documentation for the other stuff. That's why I kept it. So, I don't mind...