Due to the discussion on 4a7ec44, slightly tweaked the signature of send(OUT data) to return a Promise<Void>.

Returning Promise<Boolean> was slightly confusing because a successful send would complete the Promise with true, but an unsuccessful send would complete the Promise with an error instead of false. Completing the Promise with Void now makes the intent clear: you're not going to get a return value from a send, just be notified of success or failure via the Promise.

Since the Promise *is* an onComplete handler, there's no need to have another method for send(OUT data, Deferred onComplete). Removed that method from the interface and placed it on the Abstract class as a protected method for internal use.

Also added a sendAndForget(OUT data) variant which naively publishes data on the channel with no Promise being created to monitor the success/failure. This version of the method is really intended for situations where errors are already being handled via a call to when(Class<Throwable>, Consumer<Throwable>) and the overhead of creating new Promises for each send would be too high. The sendAndForget method is meant to be very lightweight in situations where you might be issuing a large number of sends very quickly.