Fix bug with moving files on Linux

When moving files on Linux we didn't detect when the destination
was on a different partition. This change fixes that and implements
and improves several other methods.

There is now a method PathUtilities.PathsAreOnSameVolume() that works
cross-platform. And there is a method
DirectoryUtilities.CopyDirectoryOrFileWithException that copies a
directory or a file.

Change-Id: I6c367c69ef03cd7c7d5849e707203d36a8089ef5