BUG: astype is broken for structured arrays with different byte orders

The offending commit is c53b0e4, which introduced two regressions:
- using `astype` to cast a structured array to one with a different byte order no longer works;
- comparing structured-array dtypes can give incorrect results if the two dtypes have different byte orders.

This pull request should fix both.

One thing I wasn't sure about is reordering struct fields.  In my implementation, the `equiv`, `same_kind`, and `safe` rules are now allowed to reorder fields.  If that isn't desired, though, it's a pretty easy change.
That was actually causing the bug.  Basically, the "equivalent-types" and "can-cast" concepts were being partially conflated for structured arrays, breaking both.  It's not clear from the documentation, but in my understanding of PyArray_EquivTypes, it's supposed to tell you if the two dtypes interpret the same raw binary data the same way.  In fact, in [PyArray_GetDTypeTransferFunction](https://github.com/dranjan/numpy/blob/master/numpy/core/src/multiarray/dtype_transfer.c#L3575), it's used for exactly this purpose.  However, before this PR, as you can see, struct fields were actually compared using the "can-cast" logic, which is clearly wrong if you want casting of struct arrays to be able to change byte orders.  To be fair, I don't think the documentation actually says that you can do this, but it used to work fine (at least with 'unsafe' casting) before version 1.9.