### Description

This is related to #96757.

Right now downsampling uses a thread pool with a single running thread (disallowing concurrent downsampling operations at the transport level) and an unbounded queue of waiting threads, queueing and waiting to be executed. We need to explore options around using multiple running threads here.
x-pack/plugin/rollup/src/main/java/org/elasticsearch/xpack/downsample/TransportDownsampleIndexerAction.java
RollupShardIndexer indexer = new RollupShardIndexer(
            (RollupShardTask) task,
            client,
            indexService,
            request.shardId(),
            request.getRollupIndex(),
            request.getRollupConfig(),
            request.getMetricFields(),
            request.getLabelFields()
        );
        return indexer.execute();
    }
    @Override
    protected DownsampleIndexerAction.ShardDownsampleResponse readShardResponse(StreamInput in) throws IOException {
        return new DownsampleIndexerAction.ShardDownsampleResponse(in);
    }
    @Override
    protected DownsampleIndexerAction.Response newResponse(
        DownsampleIndexerAction.Request request,
        AtomicReferenceArray<?> shardsResponses,
        ClusterState clusterState
    ) {
        long numIndexed = 0;
        int successfulShards = 0;
        for (int i = 0; i < shardsResponses.length(); i++) {
            Object shardResponse = shardsResponses.get(i);
            if (shardResponse == null) {
                throw new ElasticsearchException("missing shard");
            } else if (shardResponse instanceof DownsampleIndexerAction.ShardDownsampleResponse r) {
                successfulShards++;