Why does the implementation of find_in_path_rel try to normalize path in its "simplify" function? I'm surprised that this logic would be necessary. I understand that find_in_path cannot be used directly because it only looks in the path for "implicit" filenames¹.
I think we could just generalize find_in_path to abstract over the test used in the branch (implicit or relative; over a function or a boolean deciding which function to use, as you prefer), and then call that directly from source.ml -- this would also include the "if not (Sys.file_exists ...) then raise Not_found" logic.
¹ note to others: a filename of the form ./path or ../path is relative but not implicit, and supporting relative-but-not-implicit paths is also the reason for the proposed change in source.ml.