This is great! Looking forward to having this in the language.
Any chance we can have some sugar to avoid declaring a payload object for branches? i.e. the following would implicitly declare anonymous types for `BinaryOpr` and `UnaryOpr`: type Node = enum of BinaryOpr: (a, b: ref Node) of UnaryOpr: (a: ref Node) of Variable: string of Value: int Run