migen.fhdl.size: add fiter(), fslice(), and freversed()

do not overload __len__, __iter__, __reversed__ as not all valid
expressions (ints and bools) have them. furthermore len([]) is and
should be different from flen([]) (the later raises an error). keep
__getitem__ as an exception that proves the rule ;)
migen.fhdl.tools: move flat_iteration to migen.util.misc as tools imports other things
migen.fhdl.structure: have Cat() flat_iteration-ize its arguments
migen.fhdl.size: verify fslice for negative values