It turns out that the do_positional case, which was supposed to be uncommon
and only used for positional arguments, is always used. That's due to our
use of custom printf functions, which we use for every program.

This change wraps all of the mmaps in a helper function - both the ones for
the specs and for the buffered prints. The important thing is that we
don't do large allocations from vcore context, so we can just check for it
and branch. The allocas from an always_inline function seem safe, and the
assembly looks OK.