[Task] Fix asynchronous cancel for Task

When GCancellable is called, context is first deleted then
callback to cleanup the task is called.

GUPnPServiceProxy retrieved in context, was saved in the Task User Data
Callback.

When the context was deleted, the proxy was unreferenced/deleted.
The use of the proxy in the task callback is then prohibited.

We add a weak pointer on the GUPnPServiceProxy so the pointer on
the proxy in the task user data is set to null when the object is deleted.

Signed-off-by: Ludovic Ferrandis <ludovic.ferrandis@intel.com>
[Chain Task] Better Cancel & Error Management

end_func:
- It's now called in any condition, on error during chain call
  or when calling msu_chain_task_cancel()
- When the chain is finished and the end_func is called,
  the chain task is now also deleted.
  Update code where chain_task_delete where called.

GUPnPServiceProxy:
- Add proxy for each chain task atom and end_func
- Add weak pointer on GUPnPServiceProxy GObject
- As for Tasks, Chain Task Cancel callback could be called after
  a context has been deleted (and so proxy deleted). With weak
  pointer, proxy is now set to NULL when context is deleted.

- Remove weak pointer when an async task is finished or canceled.

Add a destroy func for the end user parameter.
Update API for end_func functionality

Fix typedef definition
Fix potential crashes:
- Test a pointer before using it.
- Duplicate 'udn' string in msu_device_new
  'udn' is a pointer to a variable owned by the GUPnP context.
  When we are shutting down, this variable does not exist any more.

Rearrange code to remove a level of indentation.

Signed-off-by: Ludovic Ferrandis <ludovic.ferrandis@intel.com>