### Elasticsearch Version

8.x

### Installed Plugins

_No response_

### Java Version

_bundled_

### OS Version

Any

### Problem Description

ILM [SwapAliasesAndDeleteSourceIndexStep](https://github.com/elastic/elasticsearch/blob/ffcf0eac010df3b5ba7989c5dd87bf362dd0d311/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ilm/SwapAliasesAndDeleteSourceIndexStep.java) doesn't play nicely with with hidden aliases. 

When we copy the aliases from the source index in the move step, we do not copy the is_hidden value.

This can lead to permanently bad ILM state with an error like:

```
policy [kibana-event-log-policy] for index [.kibana-event-log-7.11.1-000044] failed on step [{"phase":"frozen","action":"searchable_snapshot","name":"swap-aliases"}]. Moving to ERROR step java.lang.IllegalStateException: alias [.kibana-event-log-7.11.1] has is_hidden set to true on indices [...]; alias must have the same is_hidden setting on all indices at org.elasticsearch.cluster.metadata.Metadata$Builder.validateAlias(Metadata.java:2089) 
```

### Steps to Reproduce

Combination of ILM and hidden aliases.

### Logs (if relevant)

_No response_
server/src/main/java/org/elasticsearch/action/admin/indices/alias/IndicesAliasesRequest.java
}
        private static final ObjectParser<AliasActions, Void> ADD_PARSER = parser(ADD.getPreferredName(), AliasActions::add);
        private static final ObjectParser<AliasActions, Void> REMOVE_PARSER = parser(REMOVE.getPreferredName(), AliasActions::remove);
        private static final ObjectParser<AliasActions, Void> REMOVE_INDEX_PARSER = parser(
            REMOVE_INDEX.getPreferredName(),
            AliasActions::removeIndex
        );
        static {
            ADD_PARSER.declareObject(AliasActions::filter, (parser, m) -> {
                try {
                    return parser.mapOrdered();
                } catch (IOException e) {
                    throw new ParsingException(parser.getTokenLocation(), "Problems parsing [filter]", e);
                }
            }, FILTER);
            
            ADD_PARSER.declareField(AliasActions::routing, XContentParser::text, ROUTING, ValueType.INT);
            ADD_PARSER.declareField(AliasActions::indexRouting, XContentParser::text, INDEX_ROUTING, ValueType.INT);
            ADD_PARSER.declareField(AliasActions::searchRouting, XContentParser::text, SEARCH_ROUTING, ValueType.INT);
            ADD_PARSER.declareField(AliasActions::writeIndex, XContentParser::booleanValue, IS_WRITE_INDEX, ValueType.BOOLEAN);
            ADD_PARSER.declareField(AliasActions::isHidden, XContentParser::booleanValue, IS_HIDDEN, ValueType.BOOLEAN);
            REMOVE_PARSER.declareField(AliasActions::mustExist, XContentParser::booleanValue, MUST_EXIST, ValueType.BOOLEAN);
        }
        /**
         * Parser for any one {@link AliasAction}.
         */
        public static final ConstructingObjectParser<AliasActions, Void> PARSER = new ConstructingObjectParser<>("alias_action", a -> {
            
            AliasActions action = null;
            for (Object o : a) {