This regularly comes up as a stumbling stone when adding int attributes: They currently need to be encoded in a way to avoids the zero value.
This adds support for zero-value int attributes by a) making the ctor determine int/enum attribute based on attribute kind, not whether the value is non-zero and b) switching getRawIntAttr() to return an Optional, so that it's possible to distinguish a zero value from non-existence.
seems dangerous to put assert in the else branch without parentheses, it might expand to nothing?