jiri: make gosh.BuildGoPkg a package-level helper

Also updates v23test's BuildGoPkg to be package-level.

MultiPart: 1/6

Change-Id: I7f4c498a0294571fa3909b7435732c0f00761efb
diff --git a/cmd/jiri/import_test.go b/cmd/jiri/import_test.go
index 6dd60c6..2410fd4 100644
--- a/cmd/jiri/import_test.go
+++ b/cmd/jiri/import_test.go
@@ -138,7 +138,7 @@
 	opts := gosh.Opts{Fatalf: t.Fatalf, Logf: t.Logf}
 	sh := gosh.NewShell(opts)
 	defer sh.Cleanup()
-	jiriTool := sh.BuildGoPkg("v.io/jiri/cmd/jiri")
+	jiriTool := gosh.BuildGoPkg(sh, sh.MakeTempDir(), "v.io/jiri/cmd/jiri")
 	for _, test := range tests {
 		if err := testImport(opts, jiriTool, test); err != nil {
 			t.Errorf("%v: %v", test.Args, err)
diff --git a/cmd/jiri/upgrade_test.go b/cmd/jiri/upgrade_test.go
index d8913ed..7aae9c5 100644
--- a/cmd/jiri/upgrade_test.go
+++ b/cmd/jiri/upgrade_test.go
@@ -201,7 +201,7 @@
 	opts := gosh.Opts{Fatalf: t.Fatalf, Logf: t.Logf}
 	sh := gosh.NewShell(opts)
 	defer sh.Cleanup()
-	jiriTool := sh.BuildGoPkg("v.io/jiri/cmd/jiri")
+	jiriTool := gosh.BuildGoPkg(sh, sh.MakeTempDir(), "v.io/jiri/cmd/jiri")
 	for _, test := range tests {
 		if err := testUpgrade(opts, jiriTool, test); err != nil {
 			t.Errorf("%v: %v", test.Args, err)
@@ -264,7 +264,7 @@
 	defer sh.Cleanup()
 	jiriRoot := sh.MakeTempDir()
 	sh.Pushd(jiriRoot)
-	jiriTool := sh.BuildGoPkg("v.io/jiri/cmd/jiri")
+	jiriTool := gosh.BuildGoPkg(sh, sh.MakeTempDir(), "v.io/jiri/cmd/jiri")
 	localData := `<manifest/>`
 	jiriData := `<manifest>
   <imports>
diff --git a/cmd/jiri/which_test.go b/cmd/jiri/which_test.go
index a60655a..1e2fe4b 100644
--- a/cmd/jiri/which_test.go
+++ b/cmd/jiri/which_test.go
@@ -16,7 +16,7 @@
 	sh := gosh.NewShell(gosh.Opts{Fatalf: t.Fatalf, Logf: t.Logf, PropagateChildOutput: true})
 	defer sh.Cleanup()
 
-	jiriBinary := sh.BuildGoPkg("v.io/jiri/cmd/jiri")
+	jiriBinary := gosh.BuildGoPkg(sh, sh.MakeTempDir(), "v.io/jiri/cmd/jiri")
 	stdout, stderr := sh.Cmd(jiriBinary, []string{"which"}...).StdoutStderr()
 	if got, want := stdout, fmt.Sprintf("# binary\n%s\n", jiriBinary); got != want {
 		t.Errorf("stdout got %q, want %q", got, want)
diff --git a/profiles/profilescmdline/manager_test.go b/profiles/profilescmdline/manager_test.go
index b00eccc..54a2743 100644
--- a/profiles/profilescmdline/manager_test.go
+++ b/profiles/profilescmdline/manager_test.go
@@ -59,7 +59,7 @@
 
 var (
 	buildInstallersOnce, buildJiriOnce     sync.Once
-	buildInstallersBindir, buildJiriBindir = "", ""
+	buildInstallersBinDir, buildJiriBinDir = "", ""
 )
 
 func newShell(t *testing.T) *gosh.Shell {
@@ -72,25 +72,37 @@
 	return gosh.NewShell(gosh.Opts{Fatalf: fatalf, Logf: t.Logf})
 }
 
+// TODO(sadovsky): This code leaves a lot of temp dirs behind. It would be nice
+// to restructure things so that all temporary artifacts get cleaned up.
 func buildInstallers(t *testing.T) string {
 	buildInstallersOnce.Do(func() {
+		binDir, err := ioutil.TempDir("", "")
+		if err != nil {
+			t.Fatal(err)
+		}
 		sh := newShell(t)
+		defer sh.Cleanup()
 		prefix := "v.io/jiri/profiles/profilescmdline/internal/"
-		sh.BuildGoPkg("v.io/jiri/cmd/jiri", "-o", "jiri")
-		sh.BuildGoPkg(prefix+"i1", "-o", "jiri-profile-i1")
-		sh.BuildGoPkg(prefix+"i2", "-o", "jiri-profile-i2")
-		buildInstallersBindir = sh.Opts.BinDir
+		gosh.BuildGoPkg(sh, binDir, "v.io/jiri/cmd/jiri", "-o", "jiri")
+		gosh.BuildGoPkg(sh, binDir, prefix+"i1", "-o", "jiri-profile-i1")
+		gosh.BuildGoPkg(sh, binDir, prefix+"i2", "-o", "jiri-profile-i2")
+		buildInstallersBinDir = binDir
 	})
-	return buildInstallersBindir
+	return buildInstallersBinDir
 }
 
 func buildJiri(t *testing.T) string {
 	buildJiriOnce.Do(func() {
+		binDir, err := ioutil.TempDir("", "")
+		if err != nil {
+			t.Fatal(err)
+		}
 		sh := newShell(t)
-		sh.BuildGoPkg("v.io/jiri/cmd/jiri", "-o", "jiri")
-		buildJiriBindir = sh.Opts.BinDir
+		defer sh.Cleanup()
+		gosh.BuildGoPkg(sh, binDir, "v.io/jiri/cmd/jiri", "-o", "jiri")
+		buildJiriBinDir = binDir
 	})
-	return buildJiriBindir
+	return buildJiriBinDir
 }
 
 func run(sh *gosh.Shell, dir, bin string, args ...string) string {