Similarly to https://github.com/elastic/elasticsearch/pull/97873 but for request handlers: let's stop passing around strings and looking these things up by name on each request when we could just pass around the `Executor` itself.
server/src/main/java/org/elasticsearch/action/support/broadcast/unpromotable/TransportBroadcastUnpromotableAction.java
ClusterService clusterService,
        TransportService transportService,
        ShardStateAction shardStateAction,
        ActionFilters actionFilters,
        Writeable.Reader<Request> requestReader,
        Executor executor
    ) {
        super(actionName, transportService, actionFilters, requestReader);
        this.clusterService = clusterService;
        this.shardStateAction = shardStateAction;
        this.transportService = transportService;
        this.transportUnpromotableAction = actionName + "[u]";
        this.executor = executor;
        transportService.registerRequestHandler(
            transportUnpromotableAction,
            this.executor,
            requestReader,
            new UnpromotableTransportHandler()
        );
    }
    protected abstract void unpromotableShardOperation(Task task, Request request, ActionListener<Response> listener);
    @Override
    protected void doExecute(Task task, Request request, ActionListener<Response> listener) {
        final var unpromotableShards = request.indexShardRoutingTable.unpromotableShards();
        final var responses = new ArrayList<Response>(unpromotableShards.size());
        try (var listeners = new RefCountingListener(listener.map(v -> combineUnpromotableShardResponses(responses)))) {
            ActionListener.completeWith(listeners.acquire(), () -> {
                final ClusterState clusterState = clusterService.state();
                if (task != null) {
                    request.setParentTask(clusterService.localNode().getId(), task.getId());