This will have the side effect of changing how describe() reports valid and invalid values. Also adds a new presence flag with values required, forbidden, and ignore (ignore used in forcing alternatives to match one of the options, making the value semi-required). If no presence flag present defaults to optional.
/cc @Marsup