Add punycode encoding/decoding to domain/email methods

This pull request changes the behaviour of ```email```, ```emailIdn```, ```domain``` and ```domainIdn``` to support IDN domains in a more intuitive way.

### ```domain``` and ```email```:
De-punycode the input if it is a valid domain or email.

This will mean that the output can always be used when talking to a server which doesn't implement punycoding itself.

Already-punycoded IDN domains, and non-IDN domains, will be returned as they would have before this change.

Non-punycoded IDN domains will be returned in their punycoded format.

### ```domainIdn``` and ```emailIdn```:
Punycode the input if it is a valid domain or email.

This is intended for displaying a domain or e-mail to a user and ensures that they will always see it in a readable format.

Already-de-punycoded IDN domains, and non-IDN domains, will be returned as they would have before this change.

Non-punycoded IDN domains will be de-punycoded before returning them.