That's mostly explained in Zack Weinberg's Fediverse post/answer: https://hackers.town/@zwol/111684752785283333
The one open thing is why BSD picked 'l' for lstat() to mean symbolic links (unless someone has asked one of the BSD people that). Possibly it's just because 'sstat()' would look weird.
(I'm the author of the linked-to entry.)