Use error-chain for error handling
There are still a couple of pain points here (EntryReader, for example), but the general layout works pretty well. With error chain and one or two handwritten impls I can pass a bare &Path to chain_err and it will construct the correct error variant and add it to the chain. This is a significant reduction in boilerplate. I still need to do some manual testing to generate some error conditions, but I think this setup will be more robust in the long term.