### Elasticsearch Version

8.11.0

### Installed Plugins

_No response_

### Java Version

_bundled_

### OS Version

Darwin Kernel Version 22.6.0

### Problem Description

User templates affect Kibana system indices. This is contrary to most system indices https://github.com/elastic/elasticsearch/pull/87933 and causes issues where settings or mappings from the template interfere with the correct working of Kibana.

Based on the description in https://github.com/elastic/elasticsearch/pull/87933 it sounds like the behaviour is intentionally different for Kibana's system indices. Most likely because Kibana used to rely on templates for the user session index. However, it looks like there was maybe a mis-communication because in 8.4.0 Kibana changed this behaviour to no longer rely on templates https://github.com/elastic/kibana/pull/134900 so this should no longer be necessary

### Steps to Reproduce

```
# Based on a real issue a customer faced on ESS
# Create a data stream template matching system indices
curl -X PUT "elastic:changeme@localhost:9200/_index_template/my-ds-template?pretty" -H 'Content-Type: application/json' -d'
{ 
  "index_patterns": [".*"],
  "data_stream": { },
  "priority": 9000,
  "_meta": {
    "description": "Template for my time series data",
    "my-custom-meta-field": "More arbitrary metadata"
  }
}
'

# Create a user able to create Kibana system indices
curl -X PUT "elastic:changeme@localhost:9200/_security/role/grant_kibana_system_indices" -H 'Content-Type: application/json' -d'
{
  "indices": [
    {
      "names": [
        ".kibana*"
      ],
      "privileges": [
        "all"
      ],
      "allow_restricted_indices": true
    }
  ]
}
'             

curl -X POST "elastic:changeme@localhost:9200/_security/user/superduperuser" -H 'Content-Type: application/json' -d'
{
  "password" : "changeme",
  "roles" : [ "superuser", "grant_kibana_system_indices" ]
}
'

# Attempt to create a Kibana system index:
curl -X PUT "superduperuser:changeme@localhost:9200/.kibana_8.11.0_001" -H 'Content-Type: application/json' -d'
{}
'
```

> {"error":{"root_cause":[{"type":"illegal_argument_exception","reason":"cannot create index with name [.kibana_8.11.0_001], because it matches with template [my-ds-template] that creates data streams only, use create data stream api instead"}],"type":"illegal_argument_exception","reason":"cannot create index with name [.kibana_8.11.0_001], because it matches with template [my-ds-template] that creates data streams only, use create data stream api instead"},"status":400}


### Logs (if relevant)

_No response_
server/src/main/java/org/elasticsearch/indices/SystemIndexDescriptor.java
public int compareTo(SystemIndexDescriptor other) {
        return minimumNodeVersion.compareTo(other.minimumNodeVersion) * -1;
    }
    /**
     * The specific type of system index that this descriptor represents. System indices can be one of four defined types; the type is used
     * to control behavior. Elasticsearch itself and plugins have system indices that are necessary for their features;
     * these system indices are referred to as internal system indices. System indices can also belong to features outside of Elasticsearch
     * that may be part of other Elastic stack components. These are external system indices as the intent is for these to be accessed via
     * normal APIs with a special value.
     *
     * Within both internal and external system indices, there are two sub-types. The first are those that are managed by Elasticsearch and
     * will have mappings/settings changed as the cluster itself is upgraded. The second are those managed by the owning applications code
     * and for those Elasticsearch will not perform any updates.
     *
     * Internal system indices are almost always managed indices that Elasticsearch manages, but there are cases where the component of
     * Elasticsearch will need to manage the system indices itself.
     */
    public enum Type {
        INTERNAL_MANAGED(false, true),
        INTERNAL_UNMANAGED(false, false),
        EXTERNAL_MANAGED(true, true),
        EXTERNAL_UNMANAGED(true, false);
        private final boolean external;
        private final boolean managed;
        Type(boolean external, boolean managed) {
            this.external = external;
            this.managed = managed;
        }
        public boolean isExternal() {
            return external;