This provides an abstraction which deals with configuring and running
programs. A Program is a static notion of a known program. A
ConfiguredProgram is a Program that has been found on the current
machine and is ready to be run (possibly with some user-supplied default
args). Configuring a program involves finding its location and if necessary
finding its version. There's reasonable default behavior for trying to find
"foo" in PATH, being able to override its location, etc.

A search path to use when locating executables. This is analogous
to the unix $PATH or win32 %PATH% but with the ability to use
the system default method for finding executables (findExecutable which
on unix is simply looking on the $PATH but on win32 is a bit more
complicated).

The default to use is [ProgSearchPathDefault] but you can add extra dirs
either before, after or instead of the default, e.g. here we add an extra
dir to search after the usual ones.