Use clang's enum_extensibility attribute to check enum values
We could avoid constructing bad enum values using enum_extensibility: https://clang.llvm.org/docs/AttributeReference.html#enum-extensibility
We could avoid constructing bad enum values using enum_extensibility: https://clang.llvm.org/docs/AttributeReference.html#enum-extensibility