DirIter had a serious bug where it would crash on an invalid path. Make it more robust and rationalize its error handling. Move it into its own module and add tests.