Code for handling unicode/punycode name conversions

Addressing #120
Technically it's "bootstring encoding" with particular parameters. So we can do that but IMO it would push things a bit outside of DNS scope.

    type Encoder {
        tmin, tmax, skew, damp, base, bias, n rune
        prefix string
    }
    var Punycode = NewEncoder(....)

    import "dns/idn"
    idn.Punycode.Encode()

and so on.... 

I'm indifferent here, as long as functionality there it is usable for me but if you see compatibility gains by using encoding approach, I'd follow up on it.