transaction callbacks and running `destroy` in a transaction

This adds transaction callbacks and tests that they are run
appropriately.  This also updates the destroy method and has it
be run using a transaction like the save method.