Rework searching for and filling in holes

We now search for all holes (past the undo metadata) and keep that info
around, updating it as we write data into the archive. The hole cache is
discarded if a file is removed and is recreated when writing more data.

This also makes --add-mod remove the mod if it was already in the file -
that should behave better when we overwrite a mod with a version that
doesn't alter as many files as the previous one, and will also reduce
the space requirements.