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.
Please document the function in more detail, in particular the meaning of the return values. Is `0` an error return? Error flags are usually negative.