use NS_ENUM and NS_OPTIONS

Using these macros brings a couple benefits with no drawbacks
- establish a fixed type (I used NSInteger) for enums
- add hints to compiler and IDE for auto-complete, switch statement exhaustiveness, and LLDB printing value names
- allow Swift compiler to auto-generate RawOptionSet / Swift enums