A preview call can be quite expensive and cause timeout in a cluster. As a short term fix we identified 2 (hopefully) small fixes:

- make the call cancellable, the main issue here seems to be that preview calls search without using a parent task id(see this fix for data feeds: https://github.com/elastic/elasticsearch/pull/88142/files#diff-aba58244cb8f9dfa3ac3b6efeb02259e3d5956576f56c1ff5e243dd2aac27381)
- pass the timeout parameter of the preview call to the search call, currently a timeout can be specified, but is ignored for the inner search call, which is executed with no timeout (see https://www.elastic.co/guide/en/elasticsearch/reference/master/search-search.html#search-search-api-query-params).

Both changes are bugs and shall be relatively simple to implement and considered for backport to the 7.17 branch.

@przemekwitek can you have a look at this?

related: #88010
x-pack/plugin/transform/src/main/java/org/elasticsearch/xpack/transform/action/TransportPreviewTransformAction.java
errors.add(error);
                    }
                }
            }
            if (errors.isEmpty() == false) {
                HeaderWarning.addWarning("Pipeline returned " + errors.size() + " errors, first error: " + errors.get(0));
            }
            TransformDestIndexSettings generatedDestIndexSettings = TransformIndex.createTransformDestIndexSettings(
                mappings.get(),
                transformId,
                Clock.systemUTC()
            );
            List<String> warnings = TransformConfigLinter.getWarnings(function, source, syncConfig);
            warnings.forEach(HeaderWarning::addWarning);
            listener.onResponse(new Response(docs, generatedDestIndexSettings));
        }, listener::onFailure);
        ActionListener<List<Map<String, Object>>> previewListener = ActionListener.wrap(docs -> {
            if (pipeline == null) {
                TransformDestIndexSettings generatedDestIndexSettings = TransformIndex.createTransformDestIndexSettings(
                    mappings.get(),
                    transformId,
                    Clock.systemUTC()
                );
                List<String> warnings = TransformConfigLinter.getWarnings(function, source, syncConfig);
                warnings.forEach(HeaderWarning::addWarning);
                listener.onResponse(new Response(docs, generatedDestIndexSettings));
            } else {
                List<Map<String, Object>> results = docs.stream().map(doc -> {
                    Map<String, Object> src = new HashMap<>();
                    String id = (String) doc.get(TransformField.DOCUMENT_ID_FIELD);