Store transaction pool sets persistently
The transaction pool currently drops all the transaction it's tracking on shutdown, and restarts with a clean slate. In the pathological case, this can lead to transactions never making it into a block (e.g. you broadcast a transaction to your only peer, and they shut down before broadcasting it further). This PR adds buckets to the transaction pool database for the current transaction sets (and heights), which are completely rewritten after each block. This ensures that, on startup, the transaction pool will be initialized with the transactions it had after processing the most recent block.