Symlink existence and validity checks

This PR swaps all symlink creation calls over to a helper which checks for symlink existence and validity.

There was a specific error that prompted me to make these changes (in some cases running setup.sh on an existing install would fail due to g++'s symlink already existing) but unfortunately I didn't keep a copy of the error. It occurred when we tried to create an already existent symlink to g++ when running setup.sh. If you see an error of that sort, you'll want to pull from master as these changes likely resolve it.