Bug 342998 Refactor ESelectionService into multiple classes
While there is a master/slave relationship "enforced" by the current implementation, it is non-obvious as the code is quite convoluted. The implementation needs to be refactored to enhance readability.
bundles/org.eclipse.e4.ui.workbench/src/org/eclipse/e4/ui/internal/workbench/SelectionServiceImpl.java
void preDestroy() {
		IEclipseContext rootContext = serviceRoot.getContext();
		if (rootContext != null && rootContext != context) {
			if (!genericListeners.isEmpty()) {
				ESelectionService selectionService = (ESelectionService) rootContext
						.get(ESelectionService.class.getName());
				Object[] listeners = genericListeners.getListeners();
				for (Object listener : listeners) {
					selectionService.removeSelectionListener((ISelectionListener) listener);
				}
			}
			if (!targetedListeners.isEmpty()) {
				ESelectionService selectionService = (ESelectionService) rootContext
						.get(ESelectionService.class.getName());
				for (Entry<String, ListenerList> entry : targetedListeners.entrySet()) {
					String partId = entry.getKey();
					for (Object listener : entry.getValue().getListeners()) {
						selectionService.removeSelectionListener(partId,
								(ISelectionListener) listener);
					}
				}
			}
		}
		genericListeners.clear();
		targetedListeners.clear();
		eventBroker.unsubscribe(eventHandler);
	}
	@PostConstruct
	void postConstruct() {
		eventBroker