a few lines of macros for making a printable enum.
using some templates with some hacky macros to allow matching on the contents of a std::variant, and getting the underlying value immediately.
also ignores if we match() on unique_ptr/shared_ptr/stack variable, match() works the same.