BUG: Fix CheckStrides and strides setter checks for available memory

This changes the logic of PyArray_CheckStrides to really check the
full extent the new array will have. It also changes the stride
setting to calculate the full real extent of the underlying array
without assuming (usually correctly) that the strides of the base
array are regular.

Add some tests for cases that previously failed.
This "closes Issue gh-2503"
MAINT: Move offset calculations into special function

Also adds a test to check offset calculation is correct when
setting strides for a base array with negative strides.
MAINT: Minor cleanup

Adding const and removing old comment.
Merge pull request #2882 from seberg/issue2503

BUG: Fix CheckStrides and strides setter checks for available memory