REFACTORED transaction and exception handling

Revamped the transation handling code to properly handle nested
transactions and improved excpetion cleanup. No longer hooking into
'txn_do' at all - everything is now handled with hooks into the
following Storage methods:

 * txn_begin
 * txn_commit
 * txn_rollback

Also added first test cases actually using transactions via both txn_do
and txn_begin/txn_commit.

Additionally, insert/update/delete calls are now wrapped in try/catch
with explicit cleanup calls sent to the auditors before rethrow (even
though the design technically doesn't need to worry about exceptions in
these places, it doesn't hurt and is a failsafe for codepaths I might
not be properly thinking about)

TODO: Still need to write test cases to verify the sanity of related
exception handling