Fix utf8 URL encoding

Previously, adding a non-BMP character (such as emoji) into your URL with addQueryParam would render the character as 6 percent-quoted bytes (the two surrogate pairs encoded into 3 byte UTF characters).

With this change, we iterate over code points instead of code units so we can use just 4 bytes for these characters. This is how UTF-8 is supposed to work.

Background information about 6-bytes vs 4-bytes for non-BMP characters can be found here: http://en.wikipedia.org/wiki/UTF-8#CESU-8