We can't really get away from exposing Node atm:

public abstract class AbstractNodeQueue<T> extends AtomicReference<AbstractNodeQueue.Node<T>> 

That's if we move it into a field instead, but the problem is that there is no getAndSet on Unsafe, so it cannot use LOCK XCHG. So I'll move in "isEmpty" into AbstractNodeQueue and add "count" (to signal that it's not constant-time)