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/core/src/main/java/org/elasticsearch/xpack/core/transform/action/PreviewTransformAction.java
import org.elasticsearch.xpack.core.transform.transforms.TransformDestIndexSettings;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import static org.elasticsearch.xcontent.ConstructingObjectParser.optionalConstructorArg;
public class PreviewTransformAction extends ActionType<PreviewTransformAction.Response> {
    public static final PreviewTransformAction INSTANCE = new PreviewTransformAction();
    public static final String NAME = "cluster:admin/transform/preview";
    public static final String DUMMY_DEST_INDEX_FOR_PREVIEW = "unused-transform-preview-index";
    private PreviewTransformAction() {
        super(NAME, PreviewTransformAction.Response::new);
    }
    public static class Request extends AcknowledgedRequest<Request> implements ToXContentObject {
        private final TransformConfig config;
        public Request(TransformConfig config, TimeValue timeout) {
            super(timeout);
            this.config = config;
        }
        public Request(StreamInput in) throws IOException {
            super(in);
            this.config = new TransformConfig(in);
        }
        public static Request fromXContent(final XContentParser parser, TimeValue timeout) throws IOException {
            Map<String, Object> content = parser.map();
            
            Map<String, String> tempDestination = new HashMap<>();
            tempDestination.put(DestConfig.INDEX.getPreferredName(), DUMMY_DEST_INDEX_FOR_PREVIEW);