Move attachment screenshot handling into new classes.

There are now four new classes for handling the rendering of
screenshots, file attachments, and their captions. These replace the
in-template and in-view logic that we previously had.

It also restores the ability to see the change entries for removed or
uploaded file attachments and screenshots, which went missing after
moving to the new field classes.

Unlike the new DiffField, none of these classes handle recording the
change entries. This is because publish() performs many operations on
screenshots/file attachments, and it would just end up being more
complicated and less efficient to move that code out.