Better handling of edge cases

* Handle symbolic links by resolving/following true paths
* Add helper methods for cleaner file/directory logic statements
* Simpler recursive method with more clear logical structure
* Add tests for covered edge cases