Inasmuch as anyone cares about the semantics at all, I think the clearest difference between the two is that PUT ought to create or replace a resource at the path you’re PUTting to while POST is suitable for creating something at another location (e.g. in POST-redirect-GET) or any kind of action with broader consequences.
Definitely great post. As junior developer I used to think same about CRUD mapping with HTTP verbs. There seems to be a lot of articles interpreting CRUD as get,post,put,delete and fails to tell the important differences.