### CI Link

https://gradle-enterprise.elastic.co/s/ym6b3yayxtusy/tests/:x-pack:plugin:async-search:internalClusterTest/org.elasticsearch.xpack.search.AsyncSearchActionIT/testCCSCheckCompatibility

### Repro line

./gradlew ':x-pack:plugin:async-search:internalClusterTest' --tests "org.elasticsearch.xpack.search.AsyncSearchActionIT.testCCSCheckCompatibility"

### Does it reproduce?

Yes

### Applicable branches

main

### Failure history

_No response_

### Failure excerpt

In `AsyncSearchActionIT.testCCSCheckCompatibility` and `TransportTermsEnumActionTests.TransportTermsEnumActionTests` the code assumes that it can send a request that uses the current transport version (see `DummyQueryBuilder` / `VersionedNamedWriteable` ) and that will always be incompatible with the `MINIMUM_CCS_VERSION`

However since the move to `TransportVersion` it is no longer the case that a node on the next node version will be incompatible with the previous node version (which is what `MINIMUM_CCS_VERSION` tracks). In fact, immediately after a version number they will be identical - that is, `TransportVersion.current()` will be the same version as `TransportVersion.MINIMUM_CCS_VERSION`

This causes these tests to fail until the transport version is bumped.

- https://github.com/elastic/elasticsearch/blob/6420924e314c9e154617055f1c91fa9d5f084049/x-pack/plugin/async-search/src/internalClusterTest/java/org/elasticsearch/xpack/search/AsyncSearchActionIT.java#L534
- https://github.com/elastic/elasticsearch/blob/4d3fb8d9938236dd7d6de2cae614fa8a34f66862/server/src/main/java/org/elasticsearch/TransportVersion.java#L224
 
For the test to work within the current assumptions it would need to get a `TransportVersion` that is after `MINIMUM_CCS_VERSION`, but `TransportVersionUtils` doesn't offer a way to create such a version on the fly (it has to already exist).

x-pack/plugin/async-search/src/internalClusterTest/java/org/elasticsearch/xpack/search/AsyncSearchActionIT.java
for (int i = 0; i < numDocs; i++) {
            float metric = randomFloat();
            maxMetric = Math.max(metric, maxMetric);
            minMetric = Math.min(metric, minMetric);
            String keyword = keywords[randomIntBetween(0, numKeywords - 1)];
            keywordFreqs.compute(keyword, (k, v) -> {
                if (v == null) {
                    return new AtomicInteger(1);
                }
                v.incrementAndGet();
                return v;
            });
            reqs.add(client().prepareIndex(indexName).setSource("terms", keyword, "metric", metric));
        }
        indexRandom(true, true, reqs);
    }
    @Override
    protected Settings nodeSettings(int nodeOrdinal, Settings otherSettings) {
        return Settings.builder()
            .put(super.nodeSettings(nodeOrdinal, otherSettings))
            .put(SearchService.CCS_VERSION_CHECK_SETTING.getKey(), "true")
            .build();
    }
    public void testMaxMinAggregation() throws Exception {
        int step = numShards > 2 ? randomIntBetween(2, numShards) : 2;
        int numFailures = randomBoolean() ? randomIntBetween(0, numShards) : 0;
        SearchSourceBuilder source = new SearchSourceBuilder().aggregation(AggregationBuilders.min("min").field("metric"))
            .aggregation(AggregationBuilders.max("max").field("metric"));
        try (SearchResponseIterator it = assertBlockingIterator(indexName, numShards, source, numFailures, step)) {
            AsyncSearchResponse response = it.next();