Add abstract Wallet

Add abstract Wallet layer to make it easier to change the underlying
database implementation