Move diff change description handling into a new DiffField.

DiffField is now responsible for recording change entries for new diffs,
and for showing those entries. This logic is no longer hard-coded into
the template, review_detail view, or ReviewRequestDraft.publish.

Since this (and other similar upcoming fields) require access to state
generated during the review_detail view, I've added an internal
BuiltinLocalsFieldMixin that takes in a locals() and extracts necessary
data from it. This is only meant for internal usage.

The rendered output from DiffField looks the same as it did in the
template. An upcoming change for better change entry rendering will
improve this output a bit.