public MemberVM startLocatorVM(int index,
      SerializableFunction<LocatorStarterRule> ruleOperator) {
    int port = getRandomAvailableTCPPort();
    // Use compose() to put our action at the front of the operator. That way, if the ruleOperator
    // also sets a port, that action will override ours, and the locator will use the port specified
    // by ruleOperator.
    SerializableFunction<LocatorStarterRule> ruleOperatorWithPort =
        ruleOperator.compose(x -> x.withPort(port));
    return startLocatorVM(index, 0, VersionManager.CURRENT_VERSION, ruleOperatorWithPort);
  }
In some weird situations you may not want to do local DS cleanup as that lifecyle is deferred
elsewhere - see {@code LocatorCleanupEventListener} and any test that uses {@code
PlainLocatorContextLoader} or {@code LocatorWithSecurityManagerContextLoader}

@param skipLocalDistributedSystemCleanup whether to do local DS cleanup
geode-dunit/src/main/java/org/apache/geode/test/dunit/rules/ClusterStartupRule.java