veyron2/ipc: 3 of n. 'Invoker and Signature' rationalisation.

- implement the changed ipc.Serve signature
- transition all code to use it and ipc.ServeDispatcher
- get rid of the ugliness around calling Serve multiple
  times to publish under multiple names in the mount table
  and instead provide AddName/RemoveName methods.

Change-Id: Ic5edd709d28e2670369986a5b0fce4cd22e3cafd
diff --git a/services/identity/identityd/main.go b/services/identity/identityd/main.go
index 5d4773f..f267b89 100644
--- a/services/identity/identityd/main.go
+++ b/services/identity/identityd/main.go
@@ -193,7 +193,7 @@
 
 	dispatcher := newDispatcher(googleParams, macaroonKey)
 	objectname := naming.Join("identity", fmt.Sprintf("%v", r.Principal().BlessingStore().Default()))
-	if err := server.Serve(objectname, dispatcher); err != nil {
+	if err := server.ServeDispatcher(objectname, dispatcher); err != nil {
 		return nil, nil, fmt.Errorf("failed to start Veyron services: %v", err)
 	}
 	vlog.Infof("Google blessing and discharger services enabled at %v", naming.JoinAddressName(ep.String(), objectname))
diff --git a/services/identity/revocation/revoker_test.go b/services/identity/revocation/revoker_test.go
index ad4ad7e..6bb2148 100644
--- a/services/identity/revocation/revoker_test.go
+++ b/services/identity/revocation/revoker_test.go
@@ -6,7 +6,6 @@
 	"testing"
 
 	"veyron.io/veyron/veyron2"
-	"veyron.io/veyron/veyron2/ipc"
 	"veyron.io/veyron/veyron2/naming"
 	"veyron.io/veyron/veyron2/rt"
 	"veyron.io/veyron/veyron2/security"
@@ -33,7 +32,7 @@
 		t.Fatalf("dischargerServer.Listen failed: %v", err)
 	}
 	dischargerServiceStub := services.NewServerDischarger(discharger.NewDischarger())
-	if err := dischargerServer.Serve("", ipc.LeafDispatcher(dischargerServiceStub, nil)); err != nil {
+	if err := dischargerServer.Serve("", dischargerServiceStub, nil); err != nil {
 		t.Fatalf("dischargerServer.Serve revoker: %s", err)
 	}
 	return r.Principal().PublicKey(),
diff --git a/services/mgmt/application/applicationd/main.go b/services/mgmt/application/applicationd/main.go
index e815fa4..fa11016 100644
--- a/services/mgmt/application/applicationd/main.go
+++ b/services/mgmt/application/applicationd/main.go
@@ -39,7 +39,7 @@
 	if err != nil {
 		vlog.Fatalf("Listen(%s) failed: %v", roaming.ListenSpec, err)
 	}
-	if err := server.Serve(*name, dispatcher); err != nil {
+	if err := server.ServeDispatcher(*name, dispatcher); err != nil {
 		vlog.Fatalf("Serve(%v) failed: %v", *name, err)
 	}
 	vlog.Infof("Application repository running at endpoint=%q", endpoint)
diff --git a/services/mgmt/application/impl/impl_test.go b/services/mgmt/application/impl/impl_test.go
index 672a336..c073c99 100644
--- a/services/mgmt/application/impl/impl_test.go
+++ b/services/mgmt/application/impl/impl_test.go
@@ -45,7 +45,7 @@
 	if err != nil {
 		t.Fatalf("Listen(%s) failed: %v", profiles.LocalListenSpec, err)
 	}
-	if err := server.Serve("", dispatcher); err != nil {
+	if err := server.ServeDispatcher("", dispatcher); err != nil {
 		t.Fatalf("Serve(%v) failed: %v", dispatcher, err)
 	}
 
diff --git a/services/mgmt/binary/binaryd/main.go b/services/mgmt/binary/binaryd/main.go
index 28bb8ad..eea3171 100644
--- a/services/mgmt/binary/binaryd/main.go
+++ b/services/mgmt/binary/binaryd/main.go
@@ -89,8 +89,8 @@
 		vlog.Errorf("Listen(%s) failed: %v", roaming.ListenSpec, err)
 		return
 	}
-	if err := server.Serve(*name, impl.NewDispatcher(state, auth)); err != nil {
-		vlog.Errorf("Serve(%v) failed: %v", *name, err)
+	if err := server.ServeDispatcher(*name, impl.NewDispatcher(state, auth)); err != nil {
+		vlog.Errorf("ServeDispatcher(%v) failed: %v", *name, err)
 		return
 	}
 	vlog.Infof("Binary repository running at endpoint=%q", endpoint)
diff --git a/services/mgmt/binary/impl/impl_test.go b/services/mgmt/binary/impl/impl_test.go
index 8212e1e..a38ef40 100644
--- a/services/mgmt/binary/impl/impl_test.go
+++ b/services/mgmt/binary/impl/impl_test.go
@@ -129,7 +129,7 @@
 		t.Fatalf("Listen(%s) failed: %v", profiles.LocalListenSpec, err)
 	}
 	dontPublishName := ""
-	if err := server.Serve(dontPublishName, dispatcher); err != nil {
+	if err := server.ServeDispatcher(dontPublishName, dispatcher); err != nil {
 		t.Fatalf("Serve(%q) failed: %v", dontPublishName, err)
 	}
 	name := naming.JoinAddressName(endpoint.String(), "//test")
diff --git a/services/mgmt/build/buildd/main.go b/services/mgmt/build/buildd/main.go
index b46e98c..6d05b59 100644
--- a/services/mgmt/build/buildd/main.go
+++ b/services/mgmt/build/buildd/main.go
@@ -4,7 +4,6 @@
 	"flag"
 	"os"
 
-	"veyron.io/veyron/veyron2/ipc"
 	"veyron.io/veyron/veyron2/rt"
 	"veyron.io/veyron/veyron2/services/mgmt/build"
 	"veyron.io/veyron/veyron2/vlog"
@@ -36,7 +35,7 @@
 		vlog.Errorf("Listen(%s) failed: %v", roaming.ListenSpec, err)
 		return
 	}
-	if err := server.Serve(*name, ipc.LeafDispatcher(build.NewServerBuilder(impl.NewInvoker(*gobin, *goroot)), vflag.NewAuthorizerOrDie())); err != nil {
+	if err := server.Serve(*name, build.NewServerBuilder(impl.NewInvoker(*gobin, *goroot)), vflag.NewAuthorizerOrDie()); err != nil {
 		vlog.Errorf("Serve(%v) failed: %v", *name, err)
 		return
 	}
diff --git a/services/mgmt/build/impl/impl_test.go b/services/mgmt/build/impl/impl_test.go
index dd4be30..37f0f5a 100644
--- a/services/mgmt/build/impl/impl_test.go
+++ b/services/mgmt/build/impl/impl_test.go
@@ -8,7 +8,6 @@
 	"strings"
 	"testing"
 
-	"veyron.io/veyron/veyron2/ipc"
 	"veyron.io/veyron/veyron2/rt"
 	"veyron.io/veyron/veyron2/services/mgmt/build"
 
@@ -58,7 +57,7 @@
 		t.Fatalf("Listen(%s) failed: %v", profiles.LocalListenSpec, err)
 	}
 	unpublished := ""
-	if err := server.Serve(unpublished, ipc.LeafDispatcher(build.NewServerBuilder(NewInvoker(gobin, goroot)), nil)); err != nil {
+	if err := server.Serve(unpublished, build.NewServerBuilder(NewInvoker(gobin, goroot)), nil); err != nil {
 		t.Fatalf("Serve(%q) failed: %v", unpublished, err)
 	}
 	name := "/" + endpoint.String()
diff --git a/services/mgmt/debug/server.go b/services/mgmt/debug/server.go
index 95b8c13..4cff33a 100644
--- a/services/mgmt/debug/server.go
+++ b/services/mgmt/debug/server.go
@@ -25,7 +25,7 @@
 	if err != nil {
 		return "", nil, fmt.Errorf("failed to listen on %s: %v", listenSpec, err)
 	}
-	if err := server.Serve("", disp); err != nil {
+	if err := server.ServeDispatcher("", disp); err != nil {
 		return "", nil, err
 	}
 	ep := endpoint.String()
diff --git a/services/mgmt/lib/binary/impl_test.go b/services/mgmt/lib/binary/impl_test.go
index 8ec796f..8da8032 100644
--- a/services/mgmt/lib/binary/impl_test.go
+++ b/services/mgmt/lib/binary/impl_test.go
@@ -51,7 +51,7 @@
 		t.Fatalf("Listen(%s) failed: %v", profiles.LocalListenSpec, err)
 	}
 	suffix := ""
-	if err := server.Serve(suffix, dispatcher); err != nil {
+	if err := server.ServeDispatcher(suffix, dispatcher); err != nil {
 		t.Fatalf("Serve(%v, %v) failed: %v", suffix, dispatcher, err)
 	}
 	von := naming.JoinAddressName(endpoint.String(), "//test")
diff --git a/services/mgmt/logreader/impl/common_test.go b/services/mgmt/logreader/impl/common_test.go
index c81320b..91194ad 100644
--- a/services/mgmt/logreader/impl/common_test.go
+++ b/services/mgmt/logreader/impl/common_test.go
@@ -20,7 +20,7 @@
 		t.Fatalf("Listen failed: %v", err)
 		return nil, "", err
 	}
-	if err := server.Serve("", disp); err != nil {
+	if err := server.ServeDispatcher("", disp); err != nil {
 		t.Fatalf("Serve failed: %v", err)
 		return nil, "", err
 	}
diff --git a/services/mgmt/node/impl/impl_test.go b/services/mgmt/node/impl/impl_test.go
index e412e63..600dd5c 100644
--- a/services/mgmt/node/impl/impl_test.go
+++ b/services/mgmt/node/impl/impl_test.go
@@ -167,7 +167,7 @@
 	if err != nil {
 		vlog.Fatalf("Failed to create node manager dispatcher: %v", err)
 	}
-	if err := server.Serve(publishName, dispatcher); err != nil {
+	if err := server.ServeDispatcher(publishName, dispatcher); err != nil {
 		vlog.Fatalf("Serve(%v) failed: %v", publishName, err)
 	}
 	impl.InvokeCallback(name)
@@ -239,7 +239,7 @@
 	defer rt.R().Cleanup()
 	server, _ := newServer()
 	defer server.Stop()
-	if err := server.Serve(publishName, ipc.LeafDispatcher(new(appService), nil)); err != nil {
+	if err := server.Serve(publishName, new(appService), nil); err != nil {
 		vlog.Fatalf("Serve(%v) failed: %v", publishName, err)
 	}
 	ping()
@@ -497,7 +497,7 @@
 func setupPingServer(t *testing.T) (<-chan string, func()) {
 	server, _ := newServer()
 	pingCh := make(chan string, 1)
-	if err := server.Serve("pingserver", ipc.LeafDispatcher(pingServerDisp(pingCh), nil)); err != nil {
+	if err := server.Serve("pingserver", pingServerDisp(pingCh), nil); err != nil {
 		t.Fatalf("Serve(%q, <dispatcher>) failed: %v", "pingserver", err)
 	}
 	return pingCh, func() {
@@ -1329,7 +1329,7 @@
 	server, _ := newServer()
 	defer server.Stop()
 	pingCh := make(chan string, 1)
-	if err := server.Serve("pingserver", ipc.LeafDispatcher(pingServerDisp(pingCh), nil)); err != nil {
+	if err := server.Serve("pingserver", pingServerDisp(pingCh), nil); err != nil {
 		t.Fatalf("Serve(%q, <dispatcher>) failed: %v", "pingserver", err)
 	}
 
diff --git a/services/mgmt/node/impl/mock_repo_test.go b/services/mgmt/node/impl/mock_repo_test.go
index dd90a6a..cc8241f 100644
--- a/services/mgmt/node/impl/mock_repo_test.go
+++ b/services/mgmt/node/impl/mock_repo_test.go
@@ -35,9 +35,8 @@
 func startApplicationRepository() (*application.Envelope, func()) {
 	server, _ := newServer()
 	invoker := new(arInvoker)
-	dispatcher := ipc.LeafDispatcher(repository.NewServerApplication(invoker), nil)
 	name := mockApplicationRepoName
-	if err := server.Serve(name, dispatcher); err != nil {
+	if err := server.Serve(name, repository.NewServerApplication(invoker), nil); err != nil {
 		vlog.Fatalf("Serve(%v) failed: %v", name, err)
 	}
 	return &invoker.envelope, func() {
@@ -68,9 +67,8 @@
 // returns a cleanup function.
 func startBinaryRepository() func() {
 	server, _ := newServer()
-	dispatcher := ipc.LeafDispatcher(repository.NewServerBinary(new(brInvoker)), nil)
 	name := mockBinaryRepoName
-	if err := server.Serve(name, dispatcher); err != nil {
+	if err := server.Serve(name, repository.NewServerBinary(new(brInvoker)), nil); err != nil {
 		vlog.Fatalf("Serve(%q) failed: %v", name, err)
 	}
 	return func() {
diff --git a/services/mgmt/node/impl/proxy_invoker_test.go b/services/mgmt/node/impl/proxy_invoker_test.go
index b27c671..b2861f6 100644
--- a/services/mgmt/node/impl/proxy_invoker_test.go
+++ b/services/mgmt/node/impl/proxy_invoker_test.go
@@ -16,7 +16,7 @@
 func TestProxyInvoker(t *testing.T) {
 	r := rt.R()
 
-	// server1 is a normal server with a nil dispatcher.
+	// server1 is a normal server
 	server1, err := r.NewServer()
 	if err != nil {
 		t.Fatalf("NewServer: %v", err)
@@ -27,7 +27,7 @@
 	if err != nil {
 		t.Fatalf("Listen: %v", err)
 	}
-	if err := server1.Serve("", nil); err != nil {
+	if err := server1.Serve("", &dummy{}, nil); err != nil {
 		t.Fatalf("server1.Serve: %v", err)
 	}
 
@@ -46,7 +46,7 @@
 		security.Label(security.AllLabels),
 		&stats.ServerStubStats{},
 	}
-	if err := server2.Serve("", disp); err != nil {
+	if err := server2.ServeDispatcher("", disp); err != nil {
 		t.Fatalf("server2.Serve: %v", err)
 	}
 
@@ -95,6 +95,10 @@
 	return results
 }
 
+type dummy struct{}
+
+func (*dummy) Method(_ ipc.ServerCall) error { return nil }
+
 type proxyDispatcher struct {
 	remote  string
 	label   security.Label
diff --git a/services/mgmt/node/noded/main.go b/services/mgmt/node/noded/main.go
index cda1286..47faac9 100644
--- a/services/mgmt/node/noded/main.go
+++ b/services/mgmt/node/noded/main.go
@@ -65,7 +65,7 @@
 	if err != nil {
 		vlog.Fatalf("Failed to create dispatcher: %v", err)
 	}
-	if err := server.Serve(*publishAs, dispatcher); err != nil {
+	if err := server.ServeDispatcher(*publishAs, dispatcher); err != nil {
 		vlog.Fatalf("Serve(%v) failed: %v", *publishAs, err)
 	}
 	impl.InvokeCallback(name)
diff --git a/services/mgmt/pprof/client/proxy_test.go b/services/mgmt/pprof/client/proxy_test.go
index a563d9f..9b9c655 100644
--- a/services/mgmt/pprof/client/proxy_test.go
+++ b/services/mgmt/pprof/client/proxy_test.go
@@ -37,7 +37,7 @@
 	if err != nil {
 		t.Fatalf("failed to listen: %v", err)
 	}
-	if err := s.Serve("", &dispatcher{impl.NewInvoker()}); err != nil {
+	if err := s.ServeDispatcher("", &dispatcher{impl.NewInvoker()}); err != nil {
 		t.Fatalf("failed to serve: %v", err)
 	}
 	l, err := client.StartProxy(r, naming.JoinAddressName(endpoint.String(), ""))
diff --git a/services/mgmt/profile/impl/impl_test.go b/services/mgmt/profile/impl/impl_test.go
index ec4a864..d869dc1 100644
--- a/services/mgmt/profile/impl/impl_test.go
+++ b/services/mgmt/profile/impl/impl_test.go
@@ -59,7 +59,7 @@
 	if err != nil {
 		t.Fatalf("Listen(%s) failed: %v", profiles.LocalListenSpec, err)
 	}
-	if err := server.Serve("", dispatcher); err != nil {
+	if err := server.ServeDispatcher("", dispatcher); err != nil {
 		t.Fatalf("Serve failed: %v", err)
 	}
 	t.Logf("Profile repository at %v", endpoint)
diff --git a/services/mgmt/profile/profiled/main.go b/services/mgmt/profile/profiled/main.go
index 3aee540..d01b803 100644
--- a/services/mgmt/profile/profiled/main.go
+++ b/services/mgmt/profile/profiled/main.go
@@ -39,8 +39,8 @@
 	if err != nil {
 		vlog.Fatalf("Listen(%s) failed: %v", roaming.ListenSpec, err)
 	}
-	if err := server.Serve(*name, dispatcher); err != nil {
-		vlog.Fatalf("Serve(%v) failed: %v", *name, err)
+	if err := server.ServeDispatcher(*name, dispatcher); err != nil {
+		vlog.Fatalf("ServeDispatcher(%v) failed: %v", *name, err)
 	}
 	vlog.Infof("Profile repository running at endpoint=%q", endpoint)
 
diff --git a/services/mgmt/root/rootd/main.go b/services/mgmt/root/rootd/main.go
index 1b93942..ff23fdc 100644
--- a/services/mgmt/root/rootd/main.go
+++ b/services/mgmt/root/rootd/main.go
@@ -26,8 +26,8 @@
 	}
 	vlog.VI(0).Infof("Listening on %v", ep)
 	name := ""
-	if err := server.Serve(name, dispatcher); err != nil {
-		vlog.Errorf("Serve(%v) failed: %v", name, err)
+	if err := server.ServeDispatcher(name, dispatcher); err != nil {
+		vlog.Errorf("ServeDispatcher(%v) failed: %v", name, err)
 		return
 	}
 
diff --git a/services/mgmt/stats/impl/stats_invoker_test.go b/services/mgmt/stats/impl/stats_invoker_test.go
index d15c915..e830fad 100644
--- a/services/mgmt/stats/impl/stats_invoker_test.go
+++ b/services/mgmt/stats/impl/stats_invoker_test.go
@@ -38,7 +38,7 @@
 		t.Fatalf("Listen failed: %v", err)
 		return "", nil
 	}
-	if err := server.Serve("", disp); err != nil {
+	if err := server.ServeDispatcher("", disp); err != nil {
 		t.Fatalf("Serve failed: %v", err)
 		return "", nil
 	}
diff --git a/services/mounttable/lib/mounttable_test.go b/services/mounttable/lib/mounttable_test.go
index f4a3bed..5a011f1 100644
--- a/services/mounttable/lib/mounttable_test.go
+++ b/services/mounttable/lib/mounttable_test.go
@@ -176,7 +176,7 @@
 	if err != nil {
 		boom(t, "Failed to Listen mount table: %s", err)
 	}
-	if err := server.Serve("", mt); err != nil {
+	if err := server.ServeDispatcher("", mt); err != nil {
 		boom(t, "Failed to register mock collection: %s", err)
 	}
 	estr := e.String()
@@ -197,7 +197,7 @@
 	// Add a collection service.  This is just a service we can mount
 	// and test against.
 	cPrefix := "collection"
-	if err := server.Serve(cPrefix, newCollectionServer()); err != nil {
+	if err := server.ServeDispatcher(cPrefix, newCollectionServer()); err != nil {
 		boom(t, "Failed to register mock collection: %s", err)
 	}
 	estr := e.String()
diff --git a/services/mounttable/lib/neighborhood_test.go b/services/mounttable/lib/neighborhood_test.go
index 07146da..f4d47c6 100644
--- a/services/mounttable/lib/neighborhood_test.go
+++ b/services/mounttable/lib/neighborhood_test.go
@@ -55,7 +55,7 @@
 		boom(t, "Failed to create neighborhood server: %s\n", err)
 	}
 	defer nhd.Stop()
-	if err := server.Serve("", nhd); err != nil {
+	if err := server.ServeDispatcher("", nhd); err != nil {
 		boom(t, "Failed to register neighborhood server: %s", err)
 	}
 
diff --git a/services/mounttable/mounttabled/mounttable.go b/services/mounttable/mounttabled/mounttable.go
index 7a4be80..0ef7b3b 100644
--- a/services/mounttable/mounttabled/mounttable.go
+++ b/services/mounttable/mounttabled/mounttable.go
@@ -43,8 +43,8 @@
 		os.Exit(1)
 	}
 	name := *mountName
-	if err := mtServer.Serve(name, mt); err != nil {
-		vlog.Errorf("Serve(%v) failed: %v", name, err)
+	if err := mtServer.ServeDispatcher(name, mt); err != nil {
+		vlog.Errorf("ServeDispatcher(%v) failed: %v", name, err)
 		os.Exit(1)
 	}
 
@@ -77,8 +77,8 @@
 			vlog.Errorf("NewNeighborhoodServer failed: %v", err)
 			os.Exit(1)
 		}
-		if err := nhServer.Serve(naming.JoinAddressName(myObjectName, "//nh"), nh); err != nil {
-			vlog.Errorf("nhServer.Serve failed to register neighborhood: %v", err)
+		if err := nhServer.ServeDispatcher(naming.JoinAddressName(myObjectName, "//nh"), nh); err != nil {
+			vlog.Errorf("nhServer.ServeDispatcher failed to register neighborhood: %v", err)
 			os.Exit(1)
 		}
 	}