BUG-1787: cleanup AsyncNotifyingListenableFutureTask

First move the 'listenerExecutor != null' case into a subclass,
replacing the check with proper OOP override.

Second switch to using SettableBoolean, so we bypass the need to use
ThreadLocal.set/remove in fast path. Also introduce an explicit remove
method, which can be used to cleanup the thread-local state (which was
not previously possible).

Change-Id: I6e68cb1ca791c3ea721cb3379a1e8aa6724ab9b8
Signed-off-by: Robert Varga <rovarga@cisco.com>