function reduce(event, merge, initial, disposable) {
        let output = initial;
        return map(event, e => {
            output = merge(output, e);
            return output;
        }, disposable);
    }
*NOTE* that this function returns an `Event` and it MUST be called with a `DisposableStore` whenever the returned
event is accessible to "third parties", e.g the event is a public property. Otherwise a leaked listener on the
returned event causes this utility to leak a listener on the original event.