Improve numpy.copy

* better type coverage
* I have tested that std::copy is used whenever possible.

with pythran
1000 loops, best of 3: 711 usec per loop  # 2d np.ones + copy
100 loops, best of 3: 7.7 msec per loop   # 2d np.ones + double copy
100 loops, best of 3: 8.66 msec per loop  # 2d list + copy

with cpython
100 loops, best of 3: 4.86 msec per loop  # 2d np.ones + copy
100 loops, best of 3: 7.96 msec per loop  # 2d np.ones + double copy
10 loops, best of 3: 76.8 msec per loop   # 2d list + copy
I don't know but it will: 
- prevent one array allocation in the case of list, tuple, ... (all array like)
- it may just do nothing instead of copying when it is not really necessary (copy(a) + 2)

I agree the second case is because user didn't correctly write its code but first case really exists.
Also, array case (without numpy_expr) is something like : a = copy(b)
this way, we can add a ndarray constructor specialized for ndarray(unary_expr<copy, X> const& a) and it can use memcpy no?