public final CompletableFuture<V> start(@Nullable T arg, @Nullable U rollbackArg, boolean failIfStarted) {
        return start0(arg, rollbackArg, failIfStarted);
    }
Begins the startup procedure by calling {@link #doStart(Object)}, ensuring that neither
{@link #doStart(Object)} nor {@link #doStop(Object)} is invoked concurrently. When the startup fails,
{@link #stop(Object)} will be invoked with the specified {@code rollbackArg} automatically to roll back
the side effect caused by this method and any exceptions that occurred during the rollback will be
reported to {@link #rollbackFailed(Throwable)}.

@param arg           the argument to pass to {@link #doStart(Object)},
                     or {@code null} to pass no argument.
@param rollbackArg   the argument to pass to {@link #doStop(Object)} when rolling back.
@param failIfStarted whether to fail the returned {@link CompletableFuture} with
                     an {@link IllegalStateException} when the startup procedure is already
                     in progress or done
core/src/main/java/com/linecorp/armeria/common/util/StartStopSupport.java