Disposing of Listeners properly

Every time Listen is called internally, cache the listener so that it
can be disposed of when the containing class is disposed. This might
help with garbage collection issues.