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/nodes/TransportNodesAction.java
}
        new CancellableFanOut<DiscoveryNode, NodeResponse, CheckedConsumer<ActionListener<NodesResponse>, Exception>>() {
            final ArrayList<NodeResponse> responses = new ArrayList<>(request.concreteNodes().length);
            final ArrayList<FailedNodeException> exceptions = new ArrayList<>(0);
            final TransportRequestOptions transportRequestOptions = TransportRequestOptions.timeout(request.timeout());
            @Override
            protected void sendItemRequest(DiscoveryNode discoveryNode, ActionListener<NodeResponse> listener) {
                final var nodeRequest = newNodeRequest(request);
                if (task != null) {
                    nodeRequest.setParentTask(clusterService.localNode().getId(), task.getId());
                }
                try {
                    transportService.sendRequest(
                        discoveryNode,
                        transportNodeAction,
                        nodeRequest,
                        transportRequestOptions,
                        new ActionListenerResponseHandler<>(listener, nodeResponseReader(discoveryNode), finalExecutor)
                    );
                } finally {
                    nodeRequest.decRef();
                }
            }
            @Override
            protected void onItemResponse(DiscoveryNode discoveryNode, NodeResponse nodeResponse) {
                synchronized (responses) {
                    responses.add(nodeResponse);
                }
            }
            @Override