Addresses #50 and allows writing a message selector that selects depending on the source IP.
This PR also includes changing some of the data structures for handling listeners to concurrent data structures based on actual issues found in usage, as multiple listener requires concurrent adding and removing of listeners.
Addresses #50 and allows writing a message selector that selects depending on the source IP. This PR also includes changing some of the data structures for handling listeners to concurrent data structures based on actual issues found in usage, as multiple listener requires concurrent adding and removing of listeners.