Use injection to provide feature flags
This branch moves the feature flags into an injectable interface. This will make the flags accessible from the core. If flags are used in the core, integration tests and the headless app will need to provide implementations of the FeatureFlags interface to specify which features they want to enable.