metropolis/node: use Event Value for network status

This moves over the GetIP API to use our fancy new event/value library.
The consumers of this data are currently the cluster manager and the
kubernetes root service. Both are migrated over.

Test Plan: Refactor, covered by E2E tests.

X-Origin-Diff: phab/D711
GitOrigin-RevId: 8a1e0dd35236d55492722f4439323cb2ee9574fc
diff --git a/metropolis/node/core/cluster/manager.go b/metropolis/node/core/cluster/manager.go
index 6d6d592..6c85fb3 100644
--- a/metropolis/node/core/cluster/manager.go
+++ b/metropolis/node/core/cluster/manager.go
@@ -291,10 +291,15 @@
 func (m *Manager) stateCreatingCluster(ctx context.Context) error {
 	logger := supervisor.Logger(ctx)
 	logger.Info("Creating new cluster: waiting for IP address...")
-	ip, err := m.networkService.GetIP(ctx, true)
+
+	// STOPGAP: bad use of watcher (should be long-term)
+	watcher := m.networkService.Watch()
+	defer watcher.Close()
+	data, err := watcher.Get(ctx)
 	if err != nil {
 		return fmt.Errorf("when getting IP address: %w", err)
 	}
+	ip := data.ExternalAddress
 	logger.Infof("Creating new cluster: got IP address %s", ip.String())
 
 	logger.Info("Creating new cluster: initializing storage...")
@@ -310,7 +315,7 @@
 		return fmt.Errorf("failed to create new node certificate: %w", err)
 	}
 
-	node := NewNode(cuk, *ip, *cert.Leaf)
+	node := NewNode(cuk, ip, *cert.Leaf)
 
 	m.consensus = consensus.New(consensus.Config{
 		Data:           &m.storageRoot.Data.Etcd,