Improve comment propagation

Reimplemented comment propagation code to make it more robust and more
capable of dealing with non-trivial situations.  Known issues fixed or
improved by this is:

* Comments against lines in files modified by a later merge or rebase in
  the review were not propagate forward properly to commits after the
  merge or rebase.  Issues raised in such circumstances would never be
  marked as addressed by later commits.

* Crash when attempting to comment lines in a version of a file that was
  introduced into the review by a merge commit or rebase but where the
  file is not included in the (equivalent) merge commit's diff because
  there were no (suspected) conflicts in the file.

* Reopening an issue against lines that are themselves modified by a
  later commit.  In that case, the issue is now left as "addressed" only
  with a new commit as the "addressed by" commit.  It's possible to
  reopen the issue again from there, eventually reaching either an open
  issue or an issue that is marked as addressed by the commit that
  actually addressed it.

* Support for writing comments via /showfile even if the file in question
  has been changed in the review.  This was previously not supported
  simply because the old comment propagation code was slightly difficult
  to reuse.

Notable changes:

* Introduced a new utility class Propagation used whenever comments are
  propagated between file versions (when initially created, when new
  commits are added to the review and when reopening an issue.)

* Dropped the column 'commit' from the table commentchainlines.  It was
  confusing since it was not included in the primary key of the table,
  and the columns that make up the primary key could have identical
  values for several different commits.  The value in the 'commit' column
  was thus just a commit (the first) where the comment existed against
  the specified lines.  It wasn't used a lot, and where it was, it was
  either wrong or inaccurate.

* Added columns 'from_addressed_by' and 'to_addressed_by' to the table
  commentchainchanges to properly record the changes to the column
  'addressed_by' in the table 'commentchains' when reopening an issue
  that ends up being addressed again by a different commit.  Previously,
  when reopening an issue, the 'addressed_by' column was always set to
  NULL so changes to it needn't be recorded explicitly.