There's some cleanup to be done in `FeatureMigrationIT` and related classes.

- [x] Convert `static` `preMigrationHook` and `postMigrationHook` to use instance members, retrieved from the `internalCluster()`
- [x] Use Hamcrest matchers as described [in this comment](https://github.com/elastic/elasticsearch/pull/84192/files#r812224067) for better failure output
- [x] Rename `createSimpleSettings` to `createSettings`
- [x] Rename `createSimpleMapping` to `createMapping`
- [x] add support for unknown fields https://github.com/elastic/elasticsearch/pull/84258#pullrequestreview-890890422
modules/reindex/src/internalClusterTest/java/org/elasticsearch/migration/SystemIndexMigrationIT.java
plugins.add(TestPlugin.class);
        plugins.add(ReindexPlugin.class);
        return plugins;
    }
    public void testSystemIndexMigrationCanBeInterruptedWithShutdown() throws Exception {
        CyclicBarrier taskCreated = new CyclicBarrier(2);
        CyclicBarrier shutdownCompleted = new CyclicBarrier(2);
        AtomicBoolean hasBlocked = new AtomicBoolean();
        internalCluster().setBootstrapMasterNodeIndex(0);
        final String masterName = internalCluster().startMasterOnlyNode();
        final String masterAndDataNode = internalCluster().startNode();
        createSystemIndexForDescriptor(INTERNAL_MANAGED);
        final ClusterStateListener clusterStateListener = event -> {
            PersistentTasksCustomMetadata.PersistentTask<?> task = PersistentTasksCustomMetadata.getTaskWithId(
                event.state(),
                SYSTEM_INDEX_UPGRADE_TASK_NAME
            );
            if (task != null
                && task.getState() != null 
                && hasBlocked.compareAndSet(false, true)) {
                try {
                    logger.info("Task created");
                    taskCreated.await(10, TimeUnit.SECONDS); 
                    shutdownCompleted.await(10, TimeUnit.SECONDS); 
                } catch (InterruptedException | BrokenBarrierException | TimeoutException e) {
                    throw new AssertionError(e);
                }
            }
        };
        final ClusterService clusterService = internalCluster().getCurrentMasterNodeInstance(ClusterService.class);