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
server/src/main/java/org/elasticsearch/upgrades/SystemIndexMigrationTaskState.java
out.writeGenericMap(featureCallbackMetadata);
    }
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if ((o instanceof SystemIndexMigrationTaskState) == false) return false;
        SystemIndexMigrationTaskState that = (SystemIndexMigrationTaskState) o;
        return currentIndex.equals(that.currentIndex)
            && currentFeature.equals(that.currentFeature)
            && featureCallbackMetadata.equals(that.featureCallbackMetadata);
    }
    @Override
    public int hashCode() {
        return Objects.hash(currentIndex, currentFeature, featureCallbackMetadata);
    }
    @Override
    public String toString() {
        return "SystemIndexMigrationTaskState{"
            + "currentIndex='"
            + currentIndex
            + '\''
            + ", currentFeature='"
            + currentFeature
            + '\''
            + ", featureCallbackMetadata="
            + featureCallbackMetadata
            + '}';
    }
}