Rework the run script to use argparse subcommands

Also support specifying the pragmas to use in coverage.
rework how coverage works, update coverage annotations

This switches from using stock coverage to using a custom
wrapper of the coverage api that lets us customize what
pragmas we use. The new wrapper is in tools/cov.py.

We recognize the following pragmas:

'no cover': The default coverage pragma, this now means we
            truly cannot cover it. In typ, this is reserved for
            Code that can only executes when not running under coverage.
'python2':  Code that can only execute when running under Python2.
'python3':  Code that execute when running under Python3.
'untested': Code that does not yet have tests.
'win':      Code that can only execute on Windows.

If the existing code is now run under stock coverage, we'll get reports
of a lot more uncovered code than we will under cov.py.

We also rework the 'run' wrapper to use argparse-based subcommands,
to call out to tools/cov.py to run coverage, and to run coverage and
tests for both python2 and python3 by default (it requires you to
have both in your path).

This patch also fixes a few Python3-specific regressions.