refactor SOCKS header decoding and add UDP request decoding

This adds support for decoding UDP headers. These are very similar to "regular" SOCKS request headers so I refactored our existing code a little. Also defined TypeScript interfaces for SOCKS requests and UDP requests. I think it's a little better overall.

Next step is probably to have the UDP relay actually relay data.