Register a plugin on the Update message in the Pre stage.
This way you'll have only the updated values. Check if the owner is among them (that will mean the lead has been assigned during the last update).
Then retrieve the contact field of the entity from the database (you will need to get another copy of the entity, since this field won't always be included in the plugin context).
Then retrieve the Contact from the ID and make an assign request to change the owner.
If you need to assign the contact to the same user that is the owner of the lead it is much easier to change the relationship between Lead and Contact to Cascade for ownership.