Events
type OrderPlaced struct{ ID string }
func (m *Mailer) Events(r *events.Registry) { events.On(r, m.onPlaced) // func(ctx, OrderPlaced) error events.On(r, m.audit, events.Async()) // in a goroutine; shutdown waits for it}
err := emitter.Emit(ctx, OrderPlaced{ID: id}) // inject *events.EmitterListeners subscribe by Go type; a listener of an interface type gets every event that implements it. Emit returns the errors of synchronous listeners; async errors go to events.OnError.