Fix listenToOnce memory leak

Builds off of @jmeas #3341, fixes #3226

We split out listenTo and listenToOnce from `once` to clean up any lingering listeners. Also adds some tests to check that `listenToOnce` works with maps.
It's so we can get [lines 174-176](https://github.com/akre54/backbone/blob/listentoonce-is-borked/backbone.js#L174-L176) for free in `listenToOnce`.