tests producte with range()es
removes const qualifier on step

it doesn't really help anything, and prevents the range iterators
from being assignable.
Adds test with const deref of product
const correctness for product operator*
removes extra const in filter
removes const product operator*

shouldn't have had it it in the first place, it was masking
the real issue, in filter
fixes include macro
makes imap infer Zipped type
removes mutable (idk why it was ever there)
silences unused variable warnings
smarter implementation of reversed() for arrays