This adds a replacement for FindProgramByName that accepts an optional list of paths to search. The main intent of this change is to move the code in Clang that searches for tools over to this API so that we correctly find .exe files on Windows.
Followup patches move all users of FindProgramByName over and remove it.
Why do we need the Optional? Can't we just use an empty Paths as a special value that means "read $PATH"?