dockerimg: reuse a cached gopath for cross compiling

Also build using sources in the currently checked out sketch.dev go
module if sketch is invoked inside one.
This is useful when develping sketch.
diff --git a/dockerimg/dockerimg.go b/dockerimg/dockerimg.go
index 90121fa..a416c44 100644
--- a/dockerimg/dockerimg.go
+++ b/dockerimg/dockerimg.go
@@ -369,20 +369,33 @@
 }
 
 func buildLinuxSketchBin(ctx context.Context, path string) (string, error) {
-	tmpGopath, err := os.MkdirTemp("", "sketch-linux-build")
+	homeDir, err := os.UserHomeDir()
 	if err != nil {
 		return "", err
 	}
-	defer os.RemoveAll(tmpGopath)
+	linuxGopath := filepath.Join(homeDir, ".cache", "sketch", "linuxgo")
+	if err := os.MkdirAll(linuxGopath, 0o777); err != nil {
+		return "", err
+	}
+
+	verToInstall := "@latest"
+	if out, err := exec.Command("go", "list", "-m").CombinedOutput(); err != nil {
+		return "", fmt.Errorf("failed to run go list -m: %s: %v", out, err)
+	} else {
+		if strings.TrimSpace(string(out)) == "sketch.dev" {
+			fmt.Printf("building linux agent from currently checked out module\n")
+			verToInstall = ""
+		}
+	}
 
 	start := time.Now()
-	cmd := exec.CommandContext(ctx, "go", "install", "sketch.dev/cmd/sketch@latest")
+	cmd := exec.CommandContext(ctx, "go", "install", "sketch.dev/cmd/sketch"+verToInstall)
 	cmd.Env = append(
 		os.Environ(),
 		"GOOS=linux",
 		"CGO_ENABLED=0",
 		"GOTOOLCHAIN=auto",
-		"GOPATH="+tmpGopath,
+		"GOPATH="+linuxGopath,
 	)
 
 	fmt.Printf("building linux agent binary...\n")
@@ -394,7 +407,7 @@
 		slog.DebugContext(ctx, "go", slog.Duration("elapsed", time.Now().Sub(start)), slog.String("path", cmd.Path), slog.String("args", fmt.Sprintf("%v", skribe.Redact(cmd.Args))))
 	}
 
-	src := filepath.Join(tmpGopath, "bin", "linux_"+runtime.GOARCH, "sketch")
+	src := filepath.Join(linuxGopath, "bin", "linux_"+runtime.GOARCH, "sketch")
 	dst := filepath.Join(path, "tmp-sketch-binary-linux")
 	if err := os.Rename(src, dst); err != nil {
 		return "", err