### Description

I noticed that when I run `GET my_ilm_index/_ilm/explain`, the order of the returned JSON seems without much logic.

In my case, we have 18 underlying indices, and they are returned as
```
my_ilm_index-000010
my_ilm_index-000011
my_ilm_index-000012
my_ilm_index-000001
my_ilm_index-000006
my_ilm_index-000017
my_ilm_index-000018
my_ilm_index-000007
my_ilm_index-000008
my_ilm_index-000009
my_ilm_index-000002
my_ilm_index-000013
my_ilm_index-000014
my_ilm_index-000003
my_ilm_index-000015
my_ilm_index-000004
my_ilm_index-000016
my_ilm_index-000005
```

While of course, strictly speaking, json has no order, it's still inconvenient to just get a quick look at what's happening.

Could this get an ordering?

**Details:**
Elastic 7.16.2 in docker
Kibana 7.16.2 in docker
Request done via Kibana/Dev tools/console (on Chrome, on Windows 10)
x-pack/plugin/ilm/qa/multi-node/src/javaRestTest/java/org/elasticsearch/xpack/ilm/ExplainLifecycleIT.java
);
        createIndexWithSettings(client(), unmanagedIndex, Settings.builder().put(IndexMetadata.SETTING_NUMBER_OF_REPLICAS, 0));
        assertBusy(() -> {
            Map<String, Map<String, Object>> explainResponse = explain(client(), index + "*", false, false);
            assertNotNull(explainResponse);
            assertThat(
                explainResponse,
                allOf(hasKey(goodIndex), hasKey(errorIndex), hasKey(nonexistantPolicyIndex), hasKey(unmanagedIndex))
            );
            Map<String, Map<String, Object>> onlyManagedResponse = explain(client(), index + "*", false, true);
            assertNotNull(onlyManagedResponse);
            assertThat(onlyManagedResponse, allOf(hasKey(goodIndex), hasKey(errorIndex), hasKey(nonexistantPolicyIndex)));
            assertThat(onlyManagedResponse, not(hasKey(unmanagedIndex)));
            Map<String, Map<String, Object>> onlyErrorsResponse = explain(client(), index + "*", true, true);
            assertNotNull(onlyErrorsResponse);
            assertThat(onlyErrorsResponse, hasKey(nonexistantPolicyIndex));
            assertThat(onlyErrorsResponse, allOf(not(hasKey(goodIndex)), not(hasKey(unmanagedIndex))));
        });
    }
    public void testExplainIndexContainsAutomaticRetriesInformation() throws Exception {
        createFullPolicy(client(), policy, TimeValue.ZERO);
        
        createIndexWithSettings(
            client(),
            index,
            Settings.builder().put(IndexMetadata.SETTING_NUMBER_OF_REPLICAS, 0).put(LifecycleSettings.LIFECYCLE_NAME, policy)
        );
        assertBusy(() -> {
            Map<String, Object> explainIndex = explainIndex(client(), index);
            assertThat((Integer) explainIndex.get(FAILED_STEP_RETRY_COUNT_FIELD), greaterThanOrEqualTo(1));