Use queue-based directory parsing instead of recursion.

In a directory with 515 files, `SmbFile#listFiles()` was returning 52000+ files with each file duplicated hundreds of times. This keeps track of seen files as well as using a queue to avoid polluting the stack with recursion.
This pre-allocations the required space before copying the data from the source collection. In the other case you'd have to expand the internal array multiple times as files were added.