This patch allows iterating typed enum via the ADT/Sequence utility.
It also changes the original design to better separate concerns:
- StrongInt only deals with safe intmax_t operations,
- SafeIntIterator presents the iterator and reverse iterator interface but only deals with safe StrongInt internally.
- iota_range only deals with SafeIntIterator internally.
This design ensures that operations are always valid. In particular, "Out of bounds" assertions fire when:
- the value_type is not representable as an intmax_t
- iterator operations make internal computation underflow/overflow
- the internal representation cannot be converted back to value_type