Improve performance of phutil_utf8_shorten()

Summary:
This function is a little slower and more complex than necessary:

  - If the string to shorten has fewer bytes than the maximum length, it certainly has fewer characters, and we can skip all the expensive utf8 operations.
  - If the terminal is longer than the maximum length, just return it unmodified. Throwing is messy and excessively strict, and we need to do expensive utf8 operations early in the function to ensure we throw consistently.

Test Plan: This is well-covered by unit tests.

Reviewers: chad, btrahan

Reviewed By: chad

CC: aran

Differential Revision: https://secure.phabricator.com/D6182