ENH: Add 'submit extension' to SlicerWizard.py

Add a utility to manipulate slicer extension description files, which
can read an existing description file or create a description from an
extension git repository, and also write a description file (without
comments). Add helpers to get a named repository from github, or a
user's fork of a github repository. Add a git helper to find or create a
remote matching a specified fetch url. Modify git 'get repository'
helper to take a callable as the 'create' parameter in order to allow
enforcing that a newly-created repository is created in an empty (or
previously non-existing) directory.

Use all of the above to start implementing a 'submit extension' command,
which takes an extension repository and creates a pull request to add
the extension to the extensions index. So far this does everything but
create the actual pull request (i.e. handles the user's fork of the
index repository, and creating and pushing the commit against the index
repository to add or update the extension).
BUG: Avoid trailing whitespace in description file

Change ExtensionDescription.py to strip whitespace from output lines
when writing the description file, in order to avoid writing trailing
space in case a value is not set.
ENH: Update user's fork when submitting extension

When submitting an extension, also push the current upstream branch to
the user's fork, so that the branch does not seem to include extraneous
history due to the target branch on the user's fork being behind
upstream.
BUG: Include target in submit branch name

Include the target branch in the extension index branch created to
submit an extension. This is required to concurrently submit to multiple
target branches (which would otherwise be impossible due to branch name
collision).
ENH: Refactor SlicerWizard logging

Convert SlicerWizard reporting to use Python's built-in logging
facility, and add additional debug messages (newly controlled by the
--debug option).

This gives us additional features and better control over logging, e.g.
we now implicitly use logging levels, with WARNING and higher going to
stderr, and INFO/DEBUG going to stdout, as well as applying text
wrapping to everything.
STYLE: Move exception logging to die()

Change die() in SlicerWizard/Utilities.py to log the current exception,
if there is one, and --debug has been given. This allows us to remove
the code to re-raise the exception (in order to produce the traceback)
any time we would otherwise call die() after catching an exception.
STYLE: Move wrapping width to formatter

Move the variable holding the text wrap width from a global in
SlicerWizard/Utilities.py to a member of the log formatter class, now
that it is only used from there, and not from a freestanding function.
ENH: Create pull request when submitting extension

Finish implementing the base logic to crate the github pull request via
SlicerWizard when submitting an extension. This seems to be working for
additions. For updates, we still also want to generate a compare URL for
the extension repository to add to the pull request message.