Moving code around and adapt the tests

There is a problem when async reading from the NIC. The SAEA object that
is used for async reading may be disposed while the socket is waiting
for incoming messages. The async method will throw an
ObjectDisposedException then. This is also causing the tests to fail.

Another issue is that on Mono there is no boxing possible for
PeerMessage as an EventHandler<T> argument. I don't know why, and I have
change the message to be a class while it's like that.

I did some benchmarks with a simple test app I wrote to benchmark the
library and it is showing pretty much no increase in CPU or memory usage
when data is sent with 100bytes every 10 miliseconds. For testing
purposes, I'm going to commit this test app and mak it mirror every
packet it gets.  I'm also trying to make it write benchmark data, so
everyone can see about performance.

NET-24, NET-4