perf: skip caching canonicalized paths when unchanged
Use `Option` to distinguish between:
- `None`: canonical path == self (no symlink in path) - avoids PathBuf allocation
- `Some(...)`: canonical path differs (symlink was resolved)
This maintains fast cache lookups while avoiding PathBuf allocations for
~63% of paths that don't contain symlinks.
Closes #852
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>