Transactions refactoring

This includes #16283 + 1 more commit to add a transaction stack and to keep the same public API.
My idea is to deprecate all transaction methods from the `connection` and offer the use of `connection. transaction_stack` instead. So we can slowly remove transaction concerns from the connection object.
The idea is also to instead of having the `Transaction` object that points to its parent, we have a `transaction_stack` which holds all transactions. Thus we can pop transactions before calling methods like `commit_transaction`, and if they raise an error, the transaction was already popped from the stack.

review @jonleighton @chancancode @rafaelfranca @tenderlove @spastorino
:-1: on this, I think having this logic inside the method is fine for now.