This program, dist, is the bootstrapping tool for the Go distribution.
It takes care of building the C programs (like the Go compiler) and
the initial bootstrap copy of the go tool.  It also serves as a catch-all
to replace odd jobs previously done with shell scripts.

Dist is itself written in very simple C.  All interaction with C libraries,
even standard C libraries, is confined to a single system-specific file
(plan9.c, unix.c, windows.c), to aid portability.  Functionality needed
by other files should be exposed via the portability layer.  Functions
in the portability layer begin with an x prefix when they would otherwise
use the same name as or be confused for an existing function.
For example, xprintf is the portable printf.

By far the most common data types in dist are strings and arrays of
strings.  Instead of using char* and char**, though, dist uses two named
data structures, Buf and Vec, which own all the data they point at.
The Buf operations are functions beginning with b; the Vec operations
are functions beginning with v.  The basic form of any function declaring
Bufs or Vecs on the stack should be

	void
	myfunc(void)
	{
		Buf b1, b2;
		Vec v1;
		
		binit(&b1);
		binit(&b2);
		vinit(&v1);
		
		... main code ...
		bprintf(&b1, "hello, world");
		vadd(&v1, bstr(&b1));  // v1 takes a copy of its argument
		bprintf(&b1, "another string");
		vadd(&v1, bstr(&b1));  // v1 now has two strings
		
		bfree(&b1);
		bfree(&b2);
		vfree(&v1);
	}
	
The binit/vinit calls prepare a buffer or vector for use, initializing the 
data structures, and the bfree/vfree calls free any memory they are still
holding onto.  Use of this idiom gives us lexically scoped allocations.

