PERF: do NPY_NAT check inside get_datetime64_nanos
Bonus of a little simplification in `array_to_datetime`

The perf pickup comes from changing a python call `ts.view('i8')` to a cython call `get_datetime64_value(ts)`.

```
In [3]: val = np.datetime64('NaT', 'D')
In [4]: %timeit pd.Timestamp(val)
```

master (leaving out "The slowest run [...]"
```
100000 loops, best of 3: 2.33 µs per loop
1000000 loops, best of 3: 2.02 µs per loop
100000 loops, best of 3: 2.44 µs per loop
100000 loops, best of 3: 1.4 µs per loop
1000000 loops, best of 3: 2.32 µs per loop
```

PR
```
1000000 loops, best of 3: 533 ns per loop
1000000 loops, best of 3: 758 ns per loop
1000000 loops, best of 3: 734 ns per loop
1000000 loops, best of 3: 570 ns per loop
1000000 loops, best of 3: 779 ns per loop
```

```
In [9]: val2 = np.datetime64(55, 'us')
In [10]: %timeit pd.Timestamp(val2)
```

master
```
100000 loops, best of 3: 3.58 µs per loop
100000 loops, best of 3: 3.49 µs per loop
100000 loops, best of 3: 3.65 µs per loop
100000 loops, best of 3: 2.99 µs per loop
```

PR
```
1000000 loops, best of 3: 1.61 µs per loop
1000000 loops, best of 3: 1.76 µs per loop
1000000 loops, best of 3: 1.66 µs per loop
1000000 loops, best of 3: 1.49 µs per loop
```