Re-factor the file browser scanner

So we only create a single background thread for each directory tree rather than for each directory.

Vastly reduces the number of background threads
Return the cached directory size early if we have it