Make sure that the weak reference the the listener is always defined.

Avoid an attribute error from
`getattr( obj_weak_ref(), self.name )`
in case the listener object disappears during the notification process.
Traits exception handlers need to be able to re-raise exceptions in Py3.

The call to `handle_exception` needs to be made in the `except` block, in
case the handler wanted to re-raise the exception. Re-raising worked
in Python 2 but failed in Python 3.
Add extra `gc.collect()`.

Without this extra call to `gc.collect`, running the test fails sometimes
depending on the order in which the tests are called. The failure says
that there is one object *less* at the end of the test than at the
beginning. Clearly, there are object that had not been collected.
Remove unused import.
Use already-resolved reference to the object holding the listener.
Improve test for garbage collection of trait class with listeners.

I used to rely on the length of `gc.get_objects()` as the invariant for
number of objects before/after the trait class instance is created and
destroyed. That turns out to be unreliable (the internal state of the
interpreter can influence that).

Instead, we're using a weak reference callback to listen to the object
dying.
Correct spelling error.
Merge pull request #91 from enthought/cleanup-traits-notification-refactor

Cleanup traits notification refactor