ENH: more scalable sqeuclidean in spatial.distance

Memory complexity down to O(1) additional space instead of O(n),
assuming a smart implementation of np.dot.

Timings of old version, new version and the obvious alternative,
with two random vectors of length 1000:
>>> %timeit ((u - v) ** 2).sum()
100000 loops, best of 3: 15.2 us per loop
>>> %timeit np.dot(u, u) + np.dot(v, v) - 2 * np.dot(u, v)
100000 loops, best of 3: 9.27 us per loop
>>> %timeit u_v = u - v; np.dot(u_v, u_v)
100000 loops, best of 3: 8.17 us per loop

Length 10000:
>>> %timeit ((u - v) ** 2).sum()
10000 loops, best of 3: 71 us per loop
>>> %timeit np.dot(u, u) + np.dot(v, v) - 2 * np.dot(u, v)
10000 loops, best of 3: 42.4 us per loop
>>> %timeit u_v = u - v; np.dot(u_v, u_v)
10000 loops, best of 3: 38.9 us per loop

Length 100000:
>>> %timeit ((u - v) ** 2).sum()
1000 loops, best of 3: 2.01 ms per loop
>>> %timeit np.dot(u, u) + np.dot(v, v) - 2 * np.dot(u, v)
1000 loops, best of 3: 493 us per loop
>>> %timeit u_v = u - v; np.dot(u_v, u_v)
1000 loops, best of 3: 552 us per loop

Vectors generated with np.random.randn; NumPy 1.6.2 linked against
ATLAS 3.8.4.