Support for UDP trackers

Created an interface for trackers, and separated existing implementation into HttpTracker, and added UdpTracker.
You're overwriting err in each call to binary.Write and binary.Read throughout this file. I know it's going to look ugly and add a lot of lines, but please check the err value after each call and either return log.Fatal or handle it gracefully. You can use a checkError function similar to the one in diskio.go if it makes the code cleaner.