Display the "Add Comment" link after canceling an editor.

The "Add Comment" link was only being reshown after submitting a change.
If canceling, the link wasn't being shown again. We now force it to fade
in when canceling.

Fixes bug #2696

Reviewed at http://reviews.reviewboard.org/r/3415/
Fix version parsing for Mercurial.

Our version parsing was relying upon integers only in the version, and
had a probably incorrect hack for handling "+" in the version number.

Since Mercurial is a Python package following Python versioning rules,
we should be using parse_version comparisons. This is a lot less
fragile, and works with their new 1.4-rc release they just put out
(which completely breaks Review Board today).

This will be needed for an upcoming release soon.
Introduce the beginnings of an ssh app.

This introduces an ssh app, which factors out and structures the SSH
utility functions originally found in scmtools/sshutils.py.

The new ssh app contains an SSHClient object, which represents a session
tied either to a base .ssh directory, or a namespaced directory within.
Down the road, we may want to take further advantage of the namespacing,
such as for repository access. Right now, we deifne a namespace as a
'/'-separated path.

Most of the original utility functions in sshutils now live within
SSHClient. Instead of each of those taking a local_site_name parameter,
this is now passed only when defining the SSHClient, as the namespace.

Multiple clients can exist at a time.

The various SSH-related errors have moved into ssh/errors.py, and have
been decoupled from SCMError. This is clean in all cases except
AuthenticationError. Both apps have a concept of an AuthenticationError,
with ssh's being a bit more specific.

What we're doing is keeping two versions. The SSH one is
SSHAuthenticationError, and contains all the original logic. The new one
is AuthenticationError, and basically has SSHAuthenticationError as a
mixin. The two call sites in scmtools that need to really deal with this
check for an SSHAuthenticationError and convert it into an
AuthenticationError. The purpose of this is to keep the ssh app
decoupled from SCMTools.
Add support for storage backends for SSH keys.

The SSH client functionality is now separated from SSH key storage.
SSHClient has no knowledge now of where keys live. It could be on the
file system, in memory, sitting on a gopher server, or whatever else the
storage backend is talking to.

All the file access has been moved to a new FileSSHStorage class.

New unit tests have been added to test the new code paths.
Use the database as the location for SVN certificate acceptance storage.

Our cert model for Subversion worked such that when the user confirmed a
cert before adding a repository, we would tell Subversion to go ahead
and save that cert to the local ~/.subversion/auth. If the cert file
wasn't there, file fetches would fail. This made it quite annoying to
have a multi-server deployment, as that directory would have to be
shared.

Now, upon acceptance of the cert, we store the cert information in the
repository's extra_data field. We then look it up from there if pysvn
tells us it needs verification again on a cert.

We still save on the filesystem as well, which is more convenient, but
we're far more resilient now. We can work multi-server, and we can
easily nuke the auth directory, without affecting file fetches.

We also still generate the Subversion config files to configure rbssh
usage for Local Sites, but these are already resilient enough by
themselves, as they're just recreated as needed. So now, Subversion
should work perfectly fine without having to have a permanent
.subversion directory.
Merge branch 'release-1.6.x'