This was always the intention but the PointerSmudge functions would
automatically do it if the local files were missing. Now they take a
boolean argument to say whether to download or not, and the case of
skipped smudge is dealt with by writing out the original pointer data
and returning a known non-fatal error.
This refactoring will make a number of things easier. These didn't
really need to be in their own packages. Having them separate packages,
there are a few refactorings I've tried to do that end up with circular
dependencies due to things outside of `lfs` depending on `lfs`. Pushing
these into `lfs` makes refactoring simpler.