somes fixes for the roll function

* added tests for roll (based on examples in the docstring)
* raise a `ValueError` when `axis` is out of range
* handle empty arrays (currenlty, `np.roll(np.array([]), 1)` results in a `ZeroDivisionError`)