Split out BatchSubscription, refactor unsubscribe

* Split BatchSubscription out of Subscription
* Refactored CustomEvent unsubscribe to reduce to unsubscribe(sub) use case
  to call the event's configured `detach` method once per sub to be removed
  with signature `detach(target, sub)`
* Split out unregisterSub from unsubscribe to splice the sub from subs and
  clean up empty objects.
Add generic detach implementation for back compat

If the provided synthetic event config has detach (which it should), that
function is moved to _oldDetach, which is called from the SyntheticEvent.detach
implementation.