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.
Yes, it does. With complex signatures I like the return type and the function name to stand out. So I move the linkage clutter to it's own line. However, if you guys hate it I'll comply.

I'm unfamiliar with the google style guide. I just copy the style around me and then keep linting until it shuts up. ;)