Rework the file handling here to explicitly probe the type of input
we're using and use that to determine an explicit I/O strategy. This
was largely inspired by an email exchange with Duane Hesser, who
clarified some of the issues involved in doing high-quality tape
handling. I think the approach here will make it much easier to
provide optimized I/O strategies for tape and sockets.
Because of these changes, reading the directory of an ISO image stored
on a raw device (via "tar tvf /dev/cd0", for example) is about 100x
faster due to a combination of better detection of "disk-like" devices
and a more suitable strategy for handling forward skip requests.
Extracting tar devices stored on one disk drive onto a physically
separate drive should also be significantly faster because we
now do block-size cheating on disk-like devices.