update zig template
Using master build 0.12.0-dev.1625+6fd1c64f2.

Currently, when you try to build with the template, it has issues, related to open issues with compiling as lib on wasm.
Current workaround: add a dummy `export fn _start() void {}` and compile as executable.

Ergonomics suggestion: it is possible to make zig itself call the `w4`, requiring a relatively small addition to the build and a new file:
```zig
// build.zig
const std = @import("std");

pub fn build(b: *std.Build) !void {
  ...
    const runner = b.addExecutable(.{
        .name = "invoke",
        .root_source_file = .{ .path = "src/invoke.zig" },
    });

    b.installArtifact(lib);
    b.installArtifact(runner);

    const run_cmd = b.addRunArtifact(runner);
    run_cmd.step.dependOn(b.getInstallStep());
    run_cmd.addArg(b.install_path);
    if (b.args) |args| run_cmd.addArgs(args);
    
    const run_step = b.step("run", "run the program");
    run_step.dependOn(&run_cmd.step);
}
```

```zig
// invoke.zig
const std = @import("std");

pub fn main() !void {
  var gpa = std.heap.GeneralPurposeAllocator(.{}){};
  defer _ = gpa.deinit();
  const allocator = gpa.allocator();

  const args = try std.process.argsAlloc(allocator);
  defer std.process.argsFree(allocator, args);
  const exe_folder = args[1];
  const mode = if (args.len > 2) args[2] else null;
  const exe_path = try std.mem.concat(allocator, u8, &.{ exe_folder, "/bin/cart.wasm" });
  defer allocator.free(exe_path);

  var process = std.ChildProcess.init(&.{ "w4", mode orelse "run", exe_path }, allocator);
  try process.spawn();
  _ = try process.wait();
}
```

Opening as an issue first to know if I should just directly make a PR to the templates?
It bothers me that one has to create the _start function, but I couldnt find a better workaround