If we don't skip past the following separator when the destination
is empty, then `./file` gets canonicalized as `/file`.
Also, consider the case where we end up with an empty string (for
example, from `foo/..`). Canonicalize this as `.`.
The previous implementation had a few issues in certain edge cases:
- If the path contained no '/' or '\', then the string_view constructor
is called with a count that exceeds the length of the string
(effectively `title_end - (char *)0`, which is undefined behavior,
at least in C).
- If the only '/' was the filesystem root, the last character of
the title was truncated, and the '/' remained. For example,
"/title.bin" resulted in "/titl".
- At least in C, it is undefined behavior to use the the < operator
with a null pointer, which is done in std::max if the path did
not have both '/' and '\'.
The first issue results in a std::bad_alloc exception on my machine.