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.
Note that `PyObject_RichCompareBool` will fall back to `PyObject_Compare` if it is not defined, so it may be possible to simplify this, but that can be a future cleanup along with getting the other spots where it is used.