use memoryviews instead of ndarrays
For lookups and slicing memoryviews are supposed to be more performant than ndarrays.  I haven't been able to detect any difference.  @xhochy IIRC you've looked at this in some depth; are memoryviews unambiguously better for our purposes?

Getting rid of `from numpy cimport [...]` is necessary (but not sufficient) for getting rid of numpy 1.7 deprecation warnings.
I also had the feeling that they are more performant and flexible than using `ndarray` but they don't support `const object[:]` at the moment which was problematic in my case. I actually have the feeling that this is a bug in the type parsing of Cython as `const object` is not possible but `const object[:]` should be. Asked for clarification at https://github.com/cython/cython/issues/2485 but got no answer yet and I did not fully understand the Cython codebase to answer it myself. # [Codecov](https://codecov.io/gh/pandas-dev/pandas/pull/22147?src=pr&el=h1) Report
> Merging [#22147](https://codecov.io/gh/pandas-dev/pandas/pull/22147?src=pr&el=desc) into [master](https://codecov.io/gh/pandas-dev/pandas/commit/57c7daa3251e8fed3f3f709ab5bc8e707db99e98?src=pr&el=desc) will **not change** coverage.
> The diff coverage is `n/a`.

[![Impacted file tree graph](https://codecov.io/gh/pandas-dev/pandas/pull/22147/graphs/tree.svg?token=eZ4WkYLtcO&width=650&src=pr&height=150)](https://codecov.io/gh/pandas-dev/pandas/pull/22147?src=pr&el=tree)

```diff
@@           Coverage Diff           @@
##           master   #22147   +/-   ##
=======================================
  Coverage   92.07%   92.07%           
=======================================
  Files         170      170           
  Lines       50694    50694           
=======================================
  Hits        46674    46674           
  Misses       4020     4020
```

| Flag | Coverage Δ | |
|---|---|---|
| #multiple | `90.47% <ø> (ø)` | :arrow_up: |
| #single | `42.29% <ø> (ø)` | :arrow_up: |


------

[Continue to review full report at Codecov](https://codecov.io/gh/pandas-dev/pandas/pull/22147?src=pr&el=continue).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/pandas-dev/pandas/pull/22147?src=pr&el=footer). Last update [57c7daa...4cfe9e8](https://codecov.io/gh/pandas-dev/pandas/pull/22147?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).
 so this is not faster, but not slower? is it worth it at all? > so this is not faster, but not slower? is it worth it at all?

Based on %timeit results, the memoryviews do appear to be every-so-slightly faster.

The other upsides I have in mind are:
- weens us off of being numpy-specific (think: arrow)
- easier to lint (though we're a few steps away from that)
- getting rid of `from numpy cimport ...` is prerequisite to getting rid of deprecation warnings ok thanks