misc: Fix exception re-raising in RollbackContext

Former code assumed that exc_value argument is always an Exception
instance, and tried to re-raise it using the "raise value, None,
traceback" syntax. It turns out that exc_value in not an Exception
instance when a KeyError is raised inside the RollbackContext class.
In this case, exc_type is KeyError, but exc_value is the tuple
("missingkey",).  When raising this tuple using the
"raise value, None, traceback" syntax, Python hides the original error
and raises a new confusing error:

    "TypeError: exceptions must be old-style classes or derived from
    BaseException, not str"

In this patch, if there's no exception in the finally clause, python
automatically re-raises the original exception (returning True would
have swallowed it). The first exception in the finally clause is
saved and re-raised with the "raise expression, expression,
expression" syntax if there was no exception in the with clause.

Tests Added:
1. Verify that the above scenario is handled correctly.
2. Verify that when an exception is raised both from the with  statement
   and from an undo statement, the one from the with statement is the
   one raised from __exit__().

Relates-To: http://docs.python.org/2.6/reference/simple_stmts.html#the-raise-statement
Relates-To: http://docs.python.org/2.6/library/stdtypes.html#contextmanager.__exit__
Change-Id: I0052717e2307ad6fec2225b3ad5f438c5a60e1c6
Signed-off-by: Vered Volansky <vvolansk@redhat.com>
Reviewed-on: http://gerrit.ovirt.org/22860
Reviewed-by: Dan Kenigsberg <danken@redhat.com>
Tested-by: Dan Kenigsberg <danken@redhat.com>