Fix rendering of diffs that add, modify or delete empty files

After commit e5401e01 (Call added/deleted zero-length file "empty" instead
of "binary") diff.File.isBinaryChanges() is no longer true for empty files
which lead to code-paths intended for regular non-empty and non-binary
files being taken.  But for the most part, empty files need to be handled
like binary files, only we call them "empty" instead of "binary" (and don't
offer the user to download the contents.)
Fix parsing of diffs that end with a deleted empty file

For some reason, the case of an added empty file was handled, but not a
deleted one.
Add check for crashes during incremental page generation

If a crash occurs while generating a page that is delivered in chunks
(such as diffs and review front-pages) it can't be signalled by
returning a "500 Internal Server Error" to the client, since the
response has already begun (with "200 OK".)  Instead it's signalled
by appending a error message at the end of the document (or as much
of it that had already been delivered to the client.)

In the testing framework, in Frontend.page(), check the returned
document for such an error message (technically a <div class=fatal>
element) and raise a testing.TestFailure exception if one is found.