Client and WS share event listeners

This update removes the need to manually clone event listeners between the client wrapper and the inner WebSocket instance. We need to guarantee that listeners are cleaned up correctly when the WebSocket client disconnects, to prevent multiple invocation.

This PR also includes cleanup around the close->decay->preserve chain, to ensure that we're correctly testing for the desired behaviour.