Sum types in Go, or how to model events the compiler can check