handle tar files

I added tar support. It shouldn't have issues with absolute paths in tar files because everything is done with arbitrarily named temp files. I used very similar log messages to the zip version. I tried to do as much as possible on disk instead of in memory. In the cases where I have in-memory files, I think they are not really all in memory in their entirety, so it shouldn't be an issue. The input and the output are both in-memory byte arrays, so there's only so much we can do to make the memory use low.

I know there is quite a bit of code duplication between this and the zip support, but maybe that should be fixed in a separate commit.

Let me know what you think, if I should change anything, etc.