Report diff clusters when comparing snapshots

This commit introduces the DiffClusterFinder service, a class
responsible for finding clusters of differences. A cluster is defined as
adjacent rows of pixels that have at least one pixel different. A row is
adjacent to another row if it is closer than MAXIMUM_ADJACENCY_GAP
pixels (currently 20).

An upcoming commit will persist this information, and use it when
navigating the snapshot diff to highlight clusters.
Persist diff clusters

The previous commit, 2fb0a5d, introduced a way to find clusters in a
diff. This commit makes use of that information and persists each
cluster to a SnapshotDiffCluster model.

Apart from storing the clusters, I also added an `image_height` field to
the SnapshotDiff model. This will come in handy when in an upcoming
commit when I will make use of this information to highlight clusters in
the diff.
Make diff clusters keyboard-focusable

Now that we have information about where all the diff clusters are, we
can use it to enhance the snapshot review process. I've added each
cluster to the diff image container and made them keyboard-focusable.
This means that you can quickly scan through a diff using j and k. The
currently focused cluster will show up as a 2 pixel bright border to the
right border of the diff image.