Allowing user to update their contact details while renewing their membership
If you are using Drupal with a no-redirection payment processor, your best chance to do this is by using Webform CiviCRM. Webform comes with a lot of functionnality like multisteps, fields grouping and conditional fields.

Otherwise, if you are not in Drupal or want to have a cross platform solution, i can see 2 possibilities :


you do a contribution page with profile containing all the fields you need and then you add javascript to make it multistep (e.g. jquery steps). You might find it difficult to make CiviCRM embedded javascript to work in all context.
you do a contribution page that is the first step of the process and then redirect to a profile to let the user update its information when the payment is done (the user won't be able to see the thankyou page so you might want to add a thank you message in the profile). You should be able to do so using CiviCRM hook_civicrm_buildForm like :

function myextension_civicrm_buildForm($formName, &amp;$form) {
  if ($formName == 'CRM_Contribute_Form_Contribution_ThankYou') {
    $formId = $form-&gt;getVar('_id');
    if ($formId == FORM_ID) {
      ...
      $url = CRM_Utils_System::url('civicrm/profile/edit', "gid={$gid}&amp;id={$indId}&amp;reset=1&amp;context=thankyou" . $checksum, FALSE, NULL, FALSE);
      CRM_Utils_System::redirect($url);
    }
  }
}