[clang] NFC: Refactor UnsignedOrNone into OptionalUnsigned<T> with enum support (#191828)
This kind optional is simpler to use when it needs to be represented in
a bitfield, because it has an `unsigned` integer representation which
avoids overflows. This applies to enums as well.
This also adds a single use of this new functionality, migrating users
of `std::optional<NullabilityKind>`
This optional used to be represented as two members in a bitfield, and
this simplifies things down to one.