Move platform-specific declarations around.

We are going to need to use file or path predicates in a function I’m about to add, so reorder this header to declare things in logical rather than alphabetical order.
Move sysctl test to a new ‘plugins’ directory.
Define OS_POSIX on POSIX platforms.

Soon we’ll need a way to actually test whether or not we’re on a POSIX platform!
Add FileIsExecutable() predicate.
Trivial: remove overqualification of std::string.

We are `using std::string` in this file, so there’s no need of full qualification here.
Add clarifying comments.

Reading this code a couple of months after writing it, *I* wasn’t sure why it did what it did!
Trivial: add another missing comment.
Add `using std::vector` to os-posix.cc.

We’re starting to (or about to) use vectors all over the place, so make them easy to use.
Create fabrique::FindFile.

This function can be used to find any type of file in a set of directories.
Allow overriding file-not-found behaviour.

Rather than always throwing an exception, let FindFile() take a std::function to call when we want to report a missing file. This can default to fabrique::FileNotFound(), which does throw an exception, but other code (like FindModule()) might want to simply return an empty string because not finding a module in a particular set of paths is quite normal.
Refactor FindModule() to use FindFile().
Add ‘which’ plugin.

This plugin finds executables in the PATH environment variable or generic files/directories within a list of search directories.

This resolves #14.