Better thread management

For the sending thread, I removed the Thread.currentThread().sleep()
call, and instead implemented a wait/notifyAll scheme so that the thread
automatically resumes when either a packet is ready, or a set timeout,
say 100ms (entirely arbitrary, but slow enough to not cause too much CPU
use).
Small fix

The notifyAll() method needed to be surrounded by a try/catch block
because it will throw an error if there is no thread waiting to be
released from block.
Removed NetworkCommunicator files and put them into their own project.
Added support for playlist selection.