Refactor isValid and makeValid

`head (splitPath path)` is not equal to `takeDrive path` in general:

    head (splitPath "\\foo") == "\\"
    fst (splitDrive "\\foo") == ""

We can do this refactoring because they /are/ equal within the
constraint:

    `length drv >= 2 && all isPathSeparator drv`
Bug fix: isValid "\\\\?\\D:file" == False

From http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247.aspx:

* "A UNC name of any format [is never relative]."

* "You cannot use the "\\?\" prefix with a relative path."
Put "Valid x =>" constraint on joinDrive QuickCheck property

Counterexample:

    $ let x = "\\\\?\\D:file"
    $ splitDrive x
    ("\\\\?\\D:","file")
    $ uncurry joinDrive (splitDrive x)
    "\\\\?\\D:\\file"

The "problem" is that the current implementation of splitDrive can sometimes
return invalid drives, such as in the above example. However, if it wouldn't
do so, it would make the implementation of isValid and makeValid more
difficult.

My guideline is currently as follows: splitDrive makes the rough cut of what
is and what isn't a drive, isValid and makeValid finish the job, all other
functions assume drives and paths are valid.

This is also the reason joinDrive (=combineAlways) should not be changed to
not insert the extra slash, solely to handle an invalid path.
Merge pull request #32 from thomie/unc

Bug fix: isValid "\\\\?\\D:file" == False