m/n/core/curator: implement leader election

This implements the leader election functionality subset of the curator.
It does not yet implement any business logic, just the switchover
between acting as a leader and a follower.

Test plan: implements an integration test for the leader election with
an in-memory etcd cluster.

Change-Id: Id77ecc35a9f2b18e716fffd3caf2de193982d676
Reviewed-on: https://review.monogon.dev/c/monogon/+/184
Reviewed-by: Lorenz Brun <lorenz@nexantic.com>
diff --git a/metropolis/node/core/cluster/manager.go b/metropolis/node/core/cluster/manager.go
index eede40f..cc98d8e 100644
--- a/metropolis/node/core/cluster/manager.go
+++ b/metropolis/node/core/cluster/manager.go
@@ -53,6 +53,7 @@
 
 const (
 	ConsensusUserKubernetesPKI ConsensusUser = "kubernetes-pki"
+	ConsensusUserCurator       ConsensusUser = "curator"
 )
 
 // ConsensusClient returns an etcd/consensus client for a given ConsensusUser.
@@ -73,6 +74,7 @@
 	// casting to ConsensusUser from an arbitrary string.
 	switch user {
 	case ConsensusUserKubernetesPKI:
+	case ConsensusUserCurator:
 	default:
 		return nil, fmt.Errorf("unknown ConsensusUser %q", user)
 	}