Functions
Takes a PathBuf as input
Normalizes it, removes any trailing slashes, intermediate dots, and such
Traces symlinks and processes as far as can be canonicalized
If only a part of the path is canonicalize-able, then the remaining part is appended as is to the canonicalized part
Returns the canonicalized path as a PathBuf
Returns an Error if there is some problem with absolutization/canonicalization
Error => std::io::Error
Mutates the path in-place
Canonicalizes the entire path, if it is possible
If it is not possible, then it canonicalizes the head of the path and then appends the tail to it
Repeats the process until either the head is successfully canonicalized or the head is the root directory