Add CargoError::with_cause

This allows concrete implementations with a `cause` field to have a
better implementation than converting the entire original error into a
concrete representation.