Refactor PushConnection handling (#13223)

UIs now always have a PushConnection object if push is enabled,
and push reconnections do not create and set a new instance.
PushConnection.push can always be called; it internally handles
deferring the push until (re)connection if it is currently
disconnected. This is very desirable when using long polling,
as it reconnects after each push.

Change-Id: I478748cc940da86f34a5f55266f6b325682d4585