Polynomial Features Memory Usage

Hi guys,

After having a lot of memory issues with PolynomialsFeatures, I modify the transform function in order to significantly decrease the memory consumption. In the example file, the memory consumption of the old and proposed transform functions are compared. The results shown that for the example below, the memory consumption decreases from 3455 MiB to 374 MiB, without increasing the execution time.

I did not know how to erase transform_OLD and make the tests at the same time.

New tests and comparison with #3514 
---------------------------------------------------------------------------------------------
I compare the results (time and memory) of the original, #3514  and #3512. 
```
n_samples, n_features = 100000, 20
X = np.arange(-n_samples, n_samples * n_features - n_samples).reshape((n_samples, n_features))
p = PolynomialFeatures(degree=2)
```
Method | time | memory
----------|-------|-----------
Initial | 9.75 s | 3701.55 MiB
#3514 | 2.26 s | 753.88 MiB
#3512 | 10.8 s | 175.12 MiB

Change in #3512 is less but involve using a `<for i in range(n)>`, other than that is a question of preferring less memory or time.
You can probably remove temporary memory allocations with:

```
XP[i, :] = X[i, None, :]
XP[i, :] =** self.powers_
XP[i, :] *= -1
```

The removal of the memory allocation overhead might be even more beneficial for reasonably sized batches (e.g. `batch_size=1000`).

Also for Python 2 vs 3 compat, you might want to use: `from sklearn.externals.six import xrange` and use `xrange(n_samples)` instead of `range(n_samples)`.