Use explicit function pointers in FormatArg

This makes the implementation slightly shorter and saves an indirection
or two at runtime.  The cost is increasing the size of FormatList by a
third.

Also add some comments explaining the reasoning behind the way that
FormatArg is set up.
Document new vformat() functionality