msi: Implement a second cabinet extractor on top of IStream and use it to extract embedded cabinets.

Currently a cabinet stream is read into memory and then written to a file,
which is then extracted like an external cabinet file. This uses more time
and disk space than necessary and fails if the cabinet is too large to fit
into memory.
3 files changed