EZ_DestroyWidget destroies a widget and all its descendants.
It invokes the destroy callbacks registered to widget and
releases all resources allocated for widget. A
destroied widget should never be referenced again.
The actual destruction is completed in two steps. In the first
step, it recursively descends the widget tree, remove the widget
and its children from the widget hash table, inserts them into
the destroyed widget list and mark the widget and its children
destroyed. In the second step, it invokes the destroy callbacks
in post-order (invoke childrens destroy callbacks first) and
then dereference the allocated resources.