all: use make to build

This overhauls the build system.
We used to use a just-in-time clever build system
so that 'go run' and 'go install' Just Worked.

This was really nice, except that it make it
all but impossible to ship a single binary.
It also required our uses to install npm,
which some folks have an understandably negative reaction to.

This migrates to a makefile for building.
The core typescript building logic is mostly still in Go,
and untouched (boy did I learn that lesson the hard way).

The output is a single file that includes the webui, innie, and outie.

(There are still very mild shenanigans in which we write outie
out to a temp file and then 'docker cp' it into the docker container.
But this is pretty manageable.)

There are some significant follow-ups left after this commit:

- convert the nightly release builds to use the makefile
- lots of dead code removal
- maybe add -race support using a dockerfile for the cgo compilation
- maybe use 'docker cp' stdin reading with tar to avoid the temp outtie file
- all the rest of the "better release" todos (brew install, etc.)
diff --git a/embedded/embedded_outie.go b/embedded/embedded_outie.go
new file mode 100644
index 0000000..a89ff4b
--- /dev/null
+++ b/embedded/embedded_outie.go
@@ -0,0 +1,22 @@
+//go:build outie
+
+package embedded
+
+import (
+	_ "embed"
+	"io/fs"
+)
+
+//go:embed sketch-linux/sketch-linux
+var sketchLinuxBinary []byte
+
+// LinuxBinary returns the embedded linux binary.
+func LinuxBinary() []byte {
+	return sketchLinuxBinary
+}
+
+// WebUIFS returns the embedded webui filesystem.
+func WebUIFS() fs.FS {
+	// webUIAssets are not present in outie
+	return nil
+}