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.
Hum I did no understand that `.prod(-1)` is a reduction. The above is wrong and there is probably no simple way to avoid the temporary memory allocations.