### 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 
server/src/internalClusterTest/java/org/elasticsearch/search/ccs/CrossClusterSearchIT.java
searchRequest.setPreFilterShardSize(1);
        }
        
        ThrowingQueryBuilder queryBuilder = new ThrowingQueryBuilder(
            randomLong(),
            new IllegalStateException("index corrupted"),
            remoteIndex
        );
        searchRequest.source(new SearchSourceBuilder().query(queryBuilder).size(10));
        boolean minimizeRoundtrips = TransportSearchAction.shouldMinimizeRoundtrips(searchRequest);
        client(LOCAL_CLUSTER).search(searchRequest, queryFuture);
        assertBusy(() -> assertTrue(queryFuture.isDone()));
        
        if (skipUnavailable == false && minimizeRoundtrips && dfs == false) {
            ExecutionException ee = expectThrows(ExecutionException.class, () -> queryFuture.get());
            assertNotNull(ee.getCause());
            assertThat(ee.getCause(), instanceOf(RemoteTransportException.class));
            Throwable rootCause = ExceptionsHelper.unwrap(ee.getCause(), IllegalStateException.class);
            assertThat(rootCause.getMessage(), containsString("index corrupted"));
        } else {
            SearchResponse searchResponse = queryFuture.get();
            assertNotNull(searchResponse);
            SearchResponse.Clusters clusters = searchResponse.getClusters();
            if (dfs == false) {
                assertThat(clusters.isCcsMinimizeRoundtrips(), equalTo(minimizeRoundtrips));
            }
            assertThat(clusters.getTotal(), equalTo(2));
            assertThat(clusters.getClusterStateCount(SearchResponse.Cluster.Status.SUCCESSFUL), equalTo(1));
            assertThat(clusters.getClusterStateCount(SearchResponse.Cluster.Status.RUNNING), equalTo(0));
            assertThat(clusters.getClusterStateCount(SearchResponse.Cluster.Status.PARTIAL), equalTo(0));