Emit a Completed signal when the task has Succeeded/Failed/Cancelled

The client must call destroy() on the task otherwise it will leak.
The client can call destroy() early, in which case the task will be
cancelled and the object destroyed after that.

If an operation is in progress, there will always be a visible task
with a 'cancel' method.

Clients should call 'getResults' to query the state of the task before
calling 'destroy'

Signed-off-by: David Scott <dave.scott@eu.citrix.com>