Add promotion logic for arithmetic ops

This is in advance of some numba experiments
no

```python
In [5]: np.promote_types(np.int32,np.float16)
Out[5]: dtype('float64')

In [6]: np.promote_types(np.float32,np.float16)
Out[6]: dtype('float32')
```