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
Can encapsulate transaction class resolution.

```ruby
transaction = transaction_class.new(@connection, current_transaction, options)
...
def transaction_class
  if @stack.empty?
    RealTransaction
  else
    SavepointTransaction
  end
end
```

Not sure if it's an overabstraction at this time, though.