Make `move_dir()` atomic again

It'd be nice to have a good error message in this case rather than just a failed assertion (and I think the assertion could be simplified to the easier-to-grok `not (parents and raise_if_exists)`.