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.