UEFI EDK II, TPM minting, QEMU launcher and basic DHCP support

Test Plan:
You still need a recent version of QEMU and swtpm installed (these are not yet integrated)
Run `make launch` and have fun with a running Smalltown instance :)

X-Origin-Diff: phab/D159
GitOrigin-RevId: c7245bfbabebf92507445525bee009a71d19caea
diff --git a/cmd/init/main.go b/cmd/init/main.go
index 1477109..ace12f7 100644
--- a/cmd/init/main.go
+++ b/cmd/init/main.go
@@ -21,16 +21,25 @@
 	"os"
 	"os/exec"
 	"os/signal"
+	"runtime/debug"
+	"smalltown/internal/network"
 	node2 "smalltown/internal/node"
 	"smalltown/internal/storage"
 	"smalltown/pkg/tpm"
-	"syscall"
 
 	"go.uber.org/zap"
 	"golang.org/x/sys/unix"
 )
 
 func main() {
+	defer func() {
+		if r := recover(); r != nil {
+			fmt.Println("Init panicked:", r)
+			debug.PrintStack()
+		}
+		unix.Sync()
+		unix.Reboot(unix.LINUX_REBOOT_CMD_POWER_OFF)
+	}()
 	logger, err := zap.NewDevelopment()
 	if err != nil {
 		panic(err)
@@ -122,6 +131,12 @@
 		panic(err)
 	}
 
+	networkSvc, err := network.NewNetworkService(network.Config{}, logger.With(zap.String("component", "network")))
+	if err != nil {
+		panic(err)
+	}
+	networkSvc.Start()
+
 	node, err := node2.NewSmalltownNode(logger, "/esp/EFI/smalltown", "/data", 7833, 7834)
 	if err != nil {
 		panic(err)
@@ -140,8 +155,8 @@
 			var status unix.WaitStatus
 			var rusage unix.Rusage
 			for {
-				res, err := unix.Wait4(-1, &status, syscall.WNOHANG, &rusage)
-				if err != nil {
+				res, err := unix.Wait4(-1, &status, unix.WNOHANG, &rusage)
+				if err != nil && err != unix.ECHILD {
 					logger.Error("Failed to wait on orphaned child", zap.Error(err))
 					break
 				}
diff --git a/cmd/mkimage/main.go b/cmd/mkimage/main.go
index e6c9c58..78eccfb 100644
--- a/cmd/mkimage/main.go
+++ b/cmd/mkimage/main.go
@@ -44,8 +44,12 @@
 }
 
 func main() {
-	os.Remove("smalltown.img")
-	diskImg, err := diskfs.Create("smalltown.img", 3*1024*1024*1024, diskfs.Raw)
+	if len(os.Args) < 3 {
+		fmt.Println("Usage: mkimage <UEFI payload> <image path>")
+		os.Exit(2)
+	}
+	os.Remove(os.Args[2])
+	diskImg, err := diskfs.Create(os.Args[2], 3*1024*1024*1024, diskfs.Raw)
 	if err != nil {
 		fmt.Printf("Failed to create disk: %v", err)
 		os.Exit(1)