When transform isn't able to detect changes it logs and audits the following message as warning:

`[${transform_id}] failed to detect changes for transform. Skipping update till next check.`

On a broken cluster this causes a flood of log messages as this gets logged for every failure. The failure happens based on `frequency`. Apart from the log spam this check isn't properly integrated into retry and failure handlers. The later would prevent the spam. The failure handler lets the transform retry based on exponential back-off. A transform that isn't executed as `unattended` should fail after the configured number of retries (if the number of retries is configured as -1 it should retry forever).

The code in question can be found in `sourceHasChanged` (called by `onStart`) in `TransformIndexer`

Todo:

 - [ ] create a failure test case that simulates the error (see details below)
 - [x] don't suppress the failure in `sourceHasChanged`, but let the error pass and be handled in `TransformFailureHandler`

Details:

The failure:

```
Caused by: org.elasticsearch.action.search.SearchPhaseExecutionException: Search rejected due to missing shards [[...][0], [...][0]]. Consider using `allow_partial_search_results` setting to bypass this error.
    at org.elasticsearch.action.search.AbstractSearchAsyncAction.run(AbstractSearchAsyncAction.java:245) ~[elasticsearch-8.5.1.jar:?]
```
x-pack/plugin/transform/src/main/java/org/elasticsearch/xpack/transform/transforms/TransformIndexer.java
if (isContinuous()) {
            changeCollector = function.buildChangeCollector(getConfig().getSyncConfig().getField());
        }
    }
    protected boolean initialRun() {
        return getPosition() == null;
    }
    @Override
    protected void onFinish(ActionListener<Void> listener) {
        startIndexerThreadShutdown();
        
        
        if (hasSourceChanged == false) {
            if (context.shouldStopAtCheckpoint()) {
                stop();
            }
            listener.onResponse(null);
            return;
        }
        ActionListener<Void> failureHandlingListener = ActionListener.wrap(listener::onResponse, failure -> {
            failureHandler.handleIndexerFailure(failure, getConfig().getSettings());
            listener.onFailure(failure);
        });
        try {
            refreshDestinationIndex(ActionListener.wrap(response -> {
                if (response.getFailedShards() > 0) {
                    logger.warn(
                        "[{}] failed to refresh transform destination index, not all data might be available after checkpoint.",
                        getJobId()
                    );