add support for installing hidden modules and using them as dependencies (WIP)

Not 100% finished yet, but getting there. I'm not confident enough yet that I'm covering everything I need to... Some code cleanup might be needed too.

Currently tackled:

 * installing a hidden module, and skipping the build for existing hidden modules
 * specifying hidden modules as dependencies via `hiddendependencies`, and resolving those dependencies correctly
 * correctly reporting hidden modules in `--dry-run` (needs an enhanced unit test)

@wpoely86: please review, since we discussed this earlier
For a handful of modules using `show` should be faster than collecting a list of *all* modules via `avail`. With `show`, you're always listing a particular module name, so filtering makes it cheaper than a full `avail`. The `3` is determined by rule of thumb and a little bit of benchmarking.

The reason I'm doing this is because in two or three places, we're using `exist` with a single module name, so collecting the full list of modules in that case is not necessary (in general).

@rtmclay: does this make sense to you (in general, not specific to only Lmod)? I.e., using `show` to check whether up to 3 specific module names exist, while collecting a list of all modules using `avail` once and then checking entries in that list for more than 3 modules?