This implements it in three different ways:
* The first is using typing.Literal for quick and easy ones
* The second is using enum.Enum for slightly more complex ones
* The last is using a Choice type hint with a decorator to pass
a list of choices.
This should hopefully cover most use cases.