metropolis/pkg/(event|pki): remove dependency to consensus/client

We are currently depending on the consensus client, even when we just
need a plain etcd client. This change removes the dependency by adding
a ThinClient interface that wraps KV amd Watcher from clientv3.

Change-Id: I33994ab35ebb3a63c9dda4b588b7f529535e3083
Reviewed-on: https://review.monogon.dev/c/monogon/+/3082
Tested-by: Jenkins CI
Reviewed-by: Serge Bazanski <serge@monogon.tech>
diff --git a/metropolis/pkg/event/etcd/etcd.go b/metropolis/pkg/event/etcd/etcd.go
index 71e8056..afcea35 100644
--- a/metropolis/pkg/event/etcd/etcd.go
+++ b/metropolis/pkg/event/etcd/etcd.go
@@ -10,7 +10,6 @@
 	"github.com/cenkalti/backoff/v4"
 	clientv3 "go.etcd.io/etcd/client/v3"
 
-	"source.monogon.dev/metropolis/node/core/consensus/client"
 	"source.monogon.dev/metropolis/pkg/event"
 )
 
@@ -22,12 +21,19 @@
 	_ event.ValueWatch[StringAt] = &Value[StringAt]{}
 )
 
+// ThinClient is a small wrapper interface to combine
+// clientv3.KV and clientv3.Watcher.
+type ThinClient interface {
+	clientv3.KV
+	clientv3.Watcher
+}
+
 // Value is an 'Event Value' backed in an etcd cluster, accessed over an
 // etcd client. This is a stateless handle and can be copied and shared across
 // goroutines.
 type Value[T any] struct {
 	decoder func(key, value []byte) (T, error)
-	etcd    client.Namespaced
+	etcd    ThinClient
 	key     string
 	keyEnd  string
 }
@@ -67,7 +73,7 @@
 // NewValue creates a new Value for a given key(s) in an etcd client. The
 // given decoder will be used to convert bytes retrieved from etcd into the
 // interface{} value retrieved by Get by this value's watcher.
-func NewValue[T any](etcd client.Namespaced, key string, decoder func(key, value []byte) (T, error), options ...*Option) *Value[T] {
+func NewValue[T any](etcd ThinClient, key string, decoder func(key, value []byte) (T, error), options ...*Option) *Value[T] {
 	res := &Value[T]{
 		decoder: decoder,
 		etcd:    etcd,