### Description

`SearchResponse.Clusters` currently uses a `HashMap<String, AtomicReference>` for storing Cluster objects. The AtomicReference CAS swaps are done in a do/while loop in most cases (e.g., in `CCSSingleCoordinatorSearchProgressListener`).

This can be replaced with a `ConcurrentHashMap` in conjunction with either `compute()` method or the `replace(key, assumed_previous_value, value)` method for atomically swapping in a new Cluster object with a CAS operation, assuring that the updates don't lose data from competing threads doing separate Cluster object updates.

See: https://github.com/elastic/elasticsearch/pull/98457/files#r1310467586 
x-pack/plugin/async-search/src/test/java/org/elasticsearch/xpack/search/AsyncSearchResponseTests.java
assert totalClusters == remoteClusters || totalClusters - remoteClusters == 1
            : "totalClusters and remoteClusters must be same or total = remote + 1";
        assert successfulClusters + skippedClusters + partialClusters > 0 : "successful + skipped + partial must be > 0";
        SearchResponse.Clusters clusters = createCCSClusterObjects(totalClusters, remoteClusters, ccsMinimizeRoundtrips);
        int successful = successfulClusters;
        int skipped = skippedClusters;
        int partial = partialClusters;
        if (totalClusters > remoteClusters) {
            String localAlias = RemoteClusterAware.LOCAL_CLUSTER_GROUP_KEY;
            AtomicReference<SearchResponse.Cluster> localRef = clusters.getCluster(localAlias);
            SearchResponse.Cluster orig = localRef.get();
            SearchResponse.Cluster updated;
            if (successful > 0) {
                updated = new SearchResponse.Cluster(
                    localAlias,
                    localRef.get().getIndexExpression(),
                    false,
                    SearchResponse.Cluster.Status.SUCCESSFUL,
                    5,
                    5,
                    0,
                    0,
                    Collections.emptyList(),
                    new TimeValue(1000),
                    false
                );
                successful--;
            } else if (skipped > 0) {
                updated = new SearchResponse.Cluster(
                    localAlias,