Improve fingerprinting of documents

Fixes two issues:
- #4456 : The first 100 bytes are often not unique as they can be
filled with standard PDF headers - so we use the first 200 KB instead.
(This may be overkill)
- Some documents we encountered have invalid xref ids, which were
always coming out as ‘0000000000000000’ - so we detect that and use the
MD5 instead.

Note: This does change the fingerprint for all previous documents, so settings etc would be lost. Maybe they should be migrated or is that acceptable?
I actually don't think this would have a performance/memory benefit - looking at the getBytes implementation in chunked_stream.js, it is essentially wrapping a call to bytes.subarray. Is there another benefit to doing this?

I guess we could call getByteRange(0, FINGERPRINT_FIRST_BYTES), although unfortunately that method doesn't exist for the non-chunked stream so we'd still have to check if the method exists.