Speed up max_len_string_array
Before:

``` python
In [5]: x = np.array(['abcd', 'abcde', 'abcdef', 'abcdefg'] * int(1e7), object)

In [2]: f = pd.lib.max_len_string_array

In [6]: %timeit f(x)
1 loops, best of 3: 501 ms per loop
```

After:

``` python
In [1]: x = np.array(['abcd', 'abcde', 'abcdef', 'abcdefg'] * int(1e7), object)

In [2]: f = pd.lib.max_len_string_array

In [3]: %timeit f(x)
10 loops, best of 3: 68.4 ms per loop
```

looks good. release note in perf section & squash. merge when ready.
 my naive quick look does show _some_ improvements to `to_hdf` when you have `object` dtypes, order is 10-15% impv. (only used in `to_stata/to_hdf`).
 @shoyer I didn't have a particular pandas use case for this. I'm going to start using it in some often called paths in odo and I wanted to see if I could squeeze out some more perf. 
 I think @jreback had some ideas about using cython memoryviews in some of re csv code similar to how I use them here. IIRC he said there are quite a few places where we don't take full advantage of what cython has to offer. For example if you type a variable as just `ndarray` you incur the overhead of the fully general get item c API whereas if you type it as `ndarray[type]` the getitem syntax goes directly to the underlying raw pointer array. 
 ok squashed. merging on pass
