Turn Event into a tagged union

If we ever need arbitrary data or more than very few bytes on `Events` we just
have to add a `void *` field in the `data` union.