public GTaskListener removeListener(GTaskListener listener) {
		if (a == listener) {
			return b;
		}
		else if (b == listener) {
			return a;
		}
		if (a instanceof MulticastTaskListener) {
			MulticastTaskListener ma = (MulticastTaskListener) a;
			a = ma.removeListener(listener);
		}
		if (b instanceof MulticastTaskListener) {
			MulticastTaskListener mb = (MulticastTaskListener) b;
			b = mb.removeListener(listener);
		}
		return this;
	}
Used by the GTaskManager to efficiently manage multiple GTaskListeners.  
<P>
When an GTaskManager has multiple listeners, instead of having a list of listeners, listeners
are chained together using MulticastTaskListeners. It avoids the creation of
an iterator every time a listener method needs to be called.
<P>
For example, the GTaskManager has a single TaskListener variable that it notifies when its state
changes.  If someone adds a listener, and the current listener is null, then it becomes the 
listener.  If it already has a listener, it will create a new MulticaseTaskListener taking in the
old listener and the new listener.  When a TaskListener method is called, it simply calls the same
method on those two listeners.
Ghidra/Framework/Project/src/main/java/ghidra/framework/task/MulticastTaskListener.java