Correct virtual link path normalization

Link loop detection now relies on the memoization map in order to short-circuit
its way out of evaluation. This is a bit of a hack and produces results
slightly different from os.path.realpath, but still arguably correct. If
someone files a bug report about this at some point, they'd better have a use
case to back it up.