How can I merge two memberships in the same contact (without losing contribution info, etc)?
Currently there's no support for what you're describing built in to CiviCRM.  You could implement this with API calls in an extension.  If you do, please consider submitting it to the extensions directory!