### 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
ensureNoCcrTasks();
    }
    private long getFollowTaskSettingsVersion(String followerIndex) {
        long settingsVersion = -1L;
        for (ShardFollowNodeTaskStatus status : getFollowTaskStatuses(followerIndex)) {
            if (settingsVersion == -1L) {
                settingsVersion = status.followerSettingsVersion();
            } else {
                assert settingsVersion == status.followerSettingsVersion();
            }
        }
        return settingsVersion;
    }
    private long getFollowTaskMappingVersion(String followerIndex) {
        long mappingVersion = -1L;
        for (ShardFollowNodeTaskStatus status : getFollowTaskStatuses(followerIndex)) {
            if (mappingVersion == -1L) {
                mappingVersion = status.followerMappingVersion();
            } else {
                assert mappingVersion == status.followerMappingVersion();
            }
        }
        return mappingVersion;
    }
    private List<ShardFollowNodeTaskStatus> getFollowTaskStatuses(String followerIndex) {
        FollowStatsAction.StatsRequest request = new StatsRequest();
        request.setIndices(new String[] { followerIndex });
        FollowStatsAction.StatsResponses response = followerClient().execute(FollowStatsAction.INSTANCE, request).actionGet();
        return response.getStatsResponses()
            .stream()