uart: provide earlyinit to allow cprintf to serial very early on
update printf() and cprintf() to use stdarg.h

Rolling your own stdarg stuff is cute, but AMD64 passes the first six parameters
via registers, using al as a count, etc.  Better to trust the toolchain to get
it right.