InMemorySubscriptionStorage: Fixed thread safety and performance issues

* Thread safety issues with the underlying lists of client Addresses
* Better performance with key lookups - O(1) vs O(n) for most ops
And also holds another copy of the data