about/contributing: Convert Subversion -> Git in the "Teach" section

This should have happend alongside:

  commit 0f5997401698b0c2624cf43fbce49326b9cf2c1a
  Author: Greg Wilson <gvwilson@third-bit.com>
  Date:   Sat Dec 15 07:03:18 2012 -0500

    Telling potential contributors to use Git instead of Subversion
compile.py: use keys instead of cmp for sorting

cmp is gone in Python 3.

I use the tuple (x._sort_key, id(x)) instead of just x._sort_key to
avoid

  Traceback (most recent call last):
    ...
    File "bin/compile.py", line 248, in _load_subfiles
      self.children.sort(key=lambda x: x._sort_key)
  TypeError: unorderable types: NoneType() < NoneType()

which happens when multiple children have _sort_key == None.  Breaking
these ties based on the child's id is random, but it works.  If you
want a predictable tie breaker, fix _sort_key ;).
Recovering lost blog post
compile.py: replace "print >> sys.stderr, ..." with "stderr.write(...)"

"print >>" is gone in Python 3.
validxml.py: fix "except a, b" to "except a as b"

Updates to Python 3 compatibility (PEP 3110).  The new syntax was
backported to Python 2.6 and 2.7.
validxml.py: convert "'%s' % (...)" -> "'{0}'.format(...)"

The '' % () syntax is gone in Python 3.  Python 2.6+ supports
.format().
validxml.py: adjust entitydefs import

The htmlentitydefs module has been renamed to html.entities in Python 3.
links.py: convert "'%s' % (...)" -> "'{0}'.format(...)"

The '' % () syntax is gone in Python 3.  Python 2.6+ supports
.format().
util.py: fix "except a, b" to "except a as b"

Updates to Python 3 compatibility (PEP 3110).  The new syntax was
backported to Python 2.6 and 2.7.
util.py: convert "'%s' % (...)" -> "'{0}'.format(...)"

The '' % () syntax is gone in Python 3.  Python 2.6+ supports
.format().
util.py: adjust entitydefs import

The htmlentitydefs module has been renamed to html.entities in Python 3.
Removing tabs
chars.py: convert "'%s' % (...)" -> "'{0}'.format(...)"

The '' % () syntax is gone in Python 3.  Python 2.6+ supports
.format().
journal.py: replace "print ..." with "print(...)"

The "print ..." statement was removed in Python 3.  Use the print()
function instead, which has been around since at least Python 2.4.
See PEP 3105 for the motivation for removing the old statement.
Merge pull request #117 from gvwilson/master

Recovering lost blog post
Merge pull request #114 from wking/contrib-git

about/contributing: Convert Subversion -> Git in the "Teach" section
util.py: adjust StringIO import for Python 3 compatibility

Assorted *IO classes have been consolidated into the "io" package in
Python 3.
links.py: Don't use set literals for Python 2.6.5 compatibility.

I'm not sure exactly when set literals were backported to the Python 2
series, but:

  $ python --version
  Python 2.6.5
  $ python -c '{1, 2}'
    File "<string>", line 1
      {1, 2}
        ^
  SyntaxError: invalid syntax
util.py: Work around ElementTree 1.2 issues

If you're running a very old version of Python (like 2.6.5), you may
not have:

* xml.etree.ElementTree.ParseError
* xml.etree.ElementTree.XMLParser().parser

Work around that (on the old versions only) by using ExpatError as a
substiture for ParseError.  Also skip foreign DTD configuration if
parser.parser is missing.
links.py: Work around XPath attributes for ElementTree 1.2

ElementTree 1.2 doesn't support XPath attributes, so we need to filter
out tags with hrefs ourselves.