Refactor: we don't need the queuedSubscriptions set in ChannelManager at all. We just need to resubscribe to all of the channels in channelNameToChannelMap whenever we get the connected callback. This ensures that all subscriptions are resubscribed (with a fresh auth token) after each connection bounce. Added an end to end test for this scenario.
Split ChannelEventListener into two interfaces, SubscriptionEventListener now receives events, and ChannelEventListener receives the subscriptionSuccess callback. You can only have one ChannelEventListener, and the way to set it is to call Pusher.subscribe() with a ChannelEventListener instance. This removes the logic where when we got the subscription success callback we looped through all of the subscription listeners and informed all of them that the subscription was successful - now we only inform the ChannelEventListener and not the SubscriptionEventListeners. ChannelEventListener also extends SubscriptionEventListener so it can be used for receiving subscription events as well as the subscription successful callback, if you want it to.