Functionality to zip files from memory
Functionality to zip files from memory

The purpose of this change is to add functionality for zipping files
from memory rather than files. This removes the necessity to write a
generated file to disk before being able to archive, thus saving lots of
disk i/o.

The struct `ArchiveFile` represents the same data that is loaded from a
file.

The new method `zipData` allows an array of `ArchiveFiles` to be passed
rather than file URLs and are zipped accordingly. Other functionality
remains identical.

marmelroy/Zip,marmelroy/Zip,marmelroy/Zip