RollbackContext: Make it complied with Python Standard

According to Python documentation, context managers should not re-raise
the exception passed to __exit__ method. If __exit__() does not return
True, Python re-raises this exception automatically. Context managers
should only raise exception from __exit__() itself. This means we should
only re-raise exception caught from the undo functions.

Another problem of the current implementation is that it suppresses str
exceptions. This is because of bug in old Python version. When an
exception is raised from within a "with" statement, exc_value would be a
raw str or int rather than Exception instance, so when we re-raise the
stored exc_value, it triggers another exception saying "exceptions must
be old-style classes or derived from BaseException, not str".
This patch fix this problem by raising the stored exception value along
with its store exception type.

This patch also adds unit test for RollbackContext.

http://docs.python.org/2/library/stdtypes.html#contextmanager.__exit__

Signed-off-by: Zhou Zheng Sheng <zhshzhou@linux.vnet.ibm.com>