Add goog.array.sortBy

The motivation is making improving clarity and performance of some sorts by using the [Schwartzian transform](https://en.wikipedia.org/wiki/Schwartzian_transform).

Analogous functions are Perl's sort, Python's [`sorted`](https://docs.python.org/3/library/functions.html#sorted) or Scala's [`sortBy`](http://www.scala-lang.org/api/2.10.3/index.html#scala.collection.SeqLike).

For example, the former way of sorting strings case-insensitively were:

```
goog.array.sort(array, goog.string.caseInsensitiveCompare)
```
which sacrifices performance by calling `String(str).toLowerCase()` twice for every comparison. (In practice, `toLowerCase` is very fast for strings of reasonable length, but you could imagine a more involved calculation.)

Or,
```
var objects = goog.array.map(array, function(str, i) {
  return {'key':str.toLowerCase(), 'value':i};
});
goog.array.sortObjectsByKey(objects, 'key');

var tmp = goog.array.clone(arr);
goog.array.forEach(objects, function(obj, i) {
  arr[i] = tmp[obj['value']];
});
```
which sacrifices clarity. (This last example could be made a bit more intuitive by by not requiring an in-place sort, but it's still messy.)

This change allows callers to simply use

```
goog.array.sortBy(array, function(str) {
  return str.toLowerCase();
});
```

---

I was not sure whether `goog.array.sortBy` or `goog.array.sortByKey` would be more clear. The second, for better or worse, resembles `goog.array.sortObjectsByKey`. I thought that they "key" might confuse callers with thinking of actual Javascript keys, objects, etc. (which are not visible to them), so I went with `sortBy`, but I have no strong feelings about this.
note with comments that you're using 'a' and 'b' as placeholders to make a tuple of key and index.