Proposal: LiteralEnum — runtime literals with static exhaustiveness

Maybe it could be modeled after NewType:

from typing import SealedLiteralType

# single source of truth:
HttpMethod = SealedLiteralType("HttpMethod", ["GET", "POST", "DELETE"])

assert list(iter(HttpMethod)) == ["GET", "POST", "DELETE"]
assert "GET" in HttpMethod

def f(m: HttpMethod): ...
f("GET")  # type checker: OK
f("PUT")  # type checker: Error