Support for UDP trackers

Created an interface for trackers, and separated existing implementation into HttpTracker, and added UdpTracker.
In fact, instead of making all these binary.Write/Read calls, you can probably do something like what I've done with the  Handshake type in peer.go. See sendHandshake() in that file and also the the peer reader() function. For example, you can create an announceRequest variable, populating the fields when creating it, and then call binary.Write once.