Mono<Void> start() {
        List<Mono<Void>> startMonos = new ArrayList<>(extensions.size());
        for (TurmsExtension extension : extensions) {
            startMonos.add(extension.startExtension()
                    .onErrorMap(t -> new RuntimeException(
                            "Caught an error while starting the extension: "
                                    + extension.getClass()
                                            .getName(),
                            t))
                    .doOnSuccess(unused -> {
                        try {
                            onExtensionStarted.accept(extension);
                        } catch (Exception e) {
                            LOGGER.error(
                                    "Caught an error while notifying the onExtensionStarted listener: "
                                            + onExtensionStarted,
                                    e);
                        }
                    }));
        }
        return Mono.whenDelayError(startMonos)
                .onErrorMap(t -> new RuntimeException(
                        "Caught errors while starting the extensions of the plugin: "
                                + descriptor.getId(),
                        t))
                .doOnSuccess(
                        unused -> LOGGER.info("The extensions of the plugin ({}) have been started",
                                descriptor.getId()));
    }
{@link TurmsPlugin} is the plugin class for plugin developers, while {@link Plugin} is the plugin
class for us and internal development.
<p>
From the perspective of Turms developers, it is more accurate to call {@link TurmsPlugin}
"CustomPlugin" or "JavaPlugin", but from the perspective of Java plugin developers, both
"JavaPlugin" and "CustomPlugin" are fluffy because it is obvious that they are developing a java
custom plugin while "TurmsPlugin" can ensure developers know that they are developing a plugin
for Turms to distinguish with other plugin classes in their classpath.

@author James Chen
turms-server-common/src/main/java/im/turms/server/common/infra/plugin/Plugin.java