Made my events asynchronous so that they didn't hijack the thread.

Fixed some threading issues where Thread.Join() could end up getting called from the thread that we were attempting to join. I think that the runtime would have done a no-op in this case.