### Description

This applies to the following APIs:
- [x] open anomaly detection
- [x] start datafeed
- [x] start data frame analytics job
- [x] start trained model deployment

Currently, if the operation takes longer than the configured `timeout`, the response status code is `500`.

With Kibana in mind, a `4xx` response would be more suitable as it will lead to showing more useful information to the user about why the request failed.

Looking at [RFC 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-408-request-timeout), it seems the most appropriate `4xx` code would be `408 Request Timeout`, even though the RFC describes a different situation. 

The alternative, `504 Gateway Timeout`, would be more appropriate for this situation but it wouldn't improve the user experience in Kibana.
x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/action/TransportStartDataFrameAnalyticsAction.java
}
    private void getStartContext(String id, Task task, ActionListener<StartContext> finalListener) {
        ParentTaskAssigningClient parentTaskClient = new ParentTaskAssigningClient(client, task.getParentTaskId());
        
        ActionListener<StartContext> validateMappingsMergeListener = ActionListener.wrap(
            startContext -> validateSourceIndexHasAnalyzableData(startContext, finalListener),
            finalListener::onFailure
        );
        
        ActionListener<StartContext> toValidateMappingsListener = ActionListener.wrap(
            startContext -> MappingsMerger.mergeMappings(
                parentTaskClient,
                startContext.config.getHeaders(),
                startContext.config.getSource(),
                ActionListener.wrap(mappings -> validateMappingsMergeListener.onResponse(startContext), finalListener::onFailure)
            ),
            finalListener::onFailure
        );
        
        ActionListener<StartContext> toValidateDestEmptyListener = ActionListener.wrap(startContext -> {
            switch (startContext.startingState) {
                case FIRST_TIME -> checkDestIndexIsEmptyIfExists(parentTaskClient, startContext, toValidateMappingsListener);
                case RESUMING_REINDEXING, RESUMING_ANALYZING, RESUMING_INFERENCE -> toValidateMappingsListener.onResponse(startContext);
                case FINISHED -> {
                    logger.info("[{}] Job has already finished", startContext.config.getId());
                    finalListener.onFailure(ExceptionsHelper.badRequestException("Cannot start because the job has already finished"));
                }
                default -> finalListener.onFailure(
                    ExceptionsHelper.serverError("Unexpected starting state {}", startContext.startingState)
                );