m/pkg/event/memory: simplify and fix implementation

The old implementation is very complicated and has multiple concurrency 
bugs. One of these bugs is already described in a block comment. Another 
bug is that if a watcher is closed while being updated, `update` will 
try to send on the closed channel `deadletterSubmitC`, which panics.

This changes it to a much simpler implementation.

It could be further simplified it by dropping the Sync flag entirely, 
which is currently unused. Or we could use the buffered channel also for 
Sync values, and just skip dropping previous values. This still ensures 
that all values are delivered, but changes the semantics slightly: Set 
would no longer block until Get is called, if there is space in the 
channel buffer.

Additionally, there is no longer a memory leak when a watcher is 
repeatedly closed and readded, but Set never called. I added a test for 
this.

Fixes #127

Change-Id: I2775a36cf2d097c5961a09a387428774a068e1f5
Reviewed-on: https://review.monogon.dev/c/monogon/+/2875
Reviewed-by: Serge Bazanski <serge@monogon.tech>
Vouch-Run-CI: Serge Bazanski <serge@monogon.tech>
Tested-by: Jenkins CI
diff --git a/metropolis/pkg/event/event.go b/metropolis/pkg/event/event.go
index 0898eb5..cb8b9b5 100644
--- a/metropolis/pkg/event/event.go
+++ b/metropolis/pkg/event/event.go
@@ -163,7 +163,7 @@
 	Get(context.Context, ...GetOption[T]) (T, error)
 
 	// Close must be called if the Watcher is not going to be used anymore -
-	// otherwise, a goroutine will leak.
+	// otherwise, it will not be garbage collected.
 	Close() error
 }