### Description

It is impossible to create a follower index with a `$` character in its name (please note, it is possible to create a regular index with `$` in its name).

This could be reproduced by rest request:
```
PUT /my-index/_ccr/follow
{
    "remote_cluster": "my-remote-cluster",
    "leader_index": "my-index$follower"
}
```

or `CcrIntegTestCase`:

```
    public void testFollowIndex() throws Exception {
        assertAcked(leaderClient().admin().indices().prepareCreate("my$index"));
        setupRemoteCluster();
        final PutFollowAction.Request followRequest = putFollow("my$index", "my$index");
        followerClient().execute(PutFollowAction.INSTANCE, followRequest).get();
    }
```

This is happening as during initial follow phase we restore the leader cluster from the remote using a snapshot restore.
Corresponding request is created with index name added to `RestoreSnapshotRequest#renamePattern` (regexp) without escaping `$`.

x-pack/plugin/ccr/src/internalClusterTest/java/org/elasticsearch/xpack/ccr/IndexFollowingIT.java
public void testLeaderIndexRed() throws Exception {
        try {
            ClusterUpdateSettingsRequest updateSettingsRequest = new ClusterUpdateSettingsRequest();
            updateSettingsRequest.persistentSettings(Settings.builder().put("cluster.routing.allocation.enable", "none"));
            assertAcked(leaderClient().admin().cluster().updateSettings(updateSettingsRequest).actionGet());
            assertAcked(
                leaderClient().admin()
                    .indices()
                    .prepareCreate("index1")
                    .setWaitForActiveShards(ActiveShardCount.NONE)
                    .setSettings(
                        Settings.builder()
                            .put(IndexMetadata.SETTING_NUMBER_OF_SHARDS, 1)
                            .put(IndexMetadata.SETTING_NUMBER_OF_REPLICAS, 0)
                            .build()
                    )
            );
            final PutFollowAction.Request followRequest = putFollow("index1", "index2");
            Exception e = expectThrows(
                IllegalArgumentException.class,
                () -> followerClient().execute(PutFollowAction.INSTANCE, followRequest).actionGet()
            );
            assertThat(e.getMessage(), equalTo("no index stats available for the leader index"));
            assertThat(ESIntegTestCase.indexExists("index2", followerClient()), is(false));
        } finally {
            
            ClusterUpdateSettingsRequest updateSettingsRequest = new ClusterUpdateSettingsRequest();
            updateSettingsRequest.persistentSettings(Settings.builder().put("cluster.routing.allocation.enable", (String) null));
            assertAcked(leaderClient().admin().cluster().updateSettings(updateSettingsRequest).actionGet());
        }