revise path normalization and concatenation

There were too many ways this could go wrong with volumes on windows, so
this commit tries to get normalization right and then uses path() to
concatenate children rather than doing by joining on "/" in other
methods.