Enhanced dispose code

We were running into issues when disposing and then re-creating the object for a new connection. NullReference exceptions would occur (mostly in the SuperSocket library which I'll do another pull request for) and events were firing during/after disposal causing timing and possible thread exceptions. This code seems to resolve those issues.