rewrite [GatherDir] to fix symlink traversal, add a prune_directory option

This is split up into several commits for easier review of each atomic change;
you may want to squash some of these together, or even take some of them
separately.

- fix symlink traversal in [GatherDir]

- rewrite [GatherDir] to filter found files with File::Find::Rule rules

- add "prune_directory" option to [GatherDir]: this is much more efficient
  than gathering a directory full of files only to prune it away later -- in
  the Moose repository, where old build directories are quite large, this cut
  the build time from 2m38s to 1m24s.