Deserializing wallet extensions, lock order is now wallet and then extension.

A deadlock condition exists for locks on Wallet and WalletExtension. At save of wallet, wallet lock is acquired and then wallet extensions lock is acquired. At deserialization of a WalletExtension, the extension's lock is acquired and then the wallet lock can be acquired. This happens if the WalletExtension access the wallet, e.g. getTransaction as used in StoredPaymentChannelClientStates. The proposed fix unconditionally acquires the wallet lock before any extension locks.
Looks good, but as you are adding Wallet.deserializeWalletExtension as a new method here, you might as well invoke addOrGet at the same time in the implementation whilst still holding the lock, so it's deserialized and added atomically?