Correctness & code-style in du

See commits for details, but summary is:
- minor code style refactoring (e.g. more DRY and fewer clones)
- using the actual executable name in error messages rather than hard-coding `du`
- handle symlinks correctly