1)  Are you going to permit people to do out of order requests?  What will you do if I do 
```scala
// assume stream: FStream[A]
val tail = stream.tail
tail.tail.head
tail.head
```?  Does the iterable abstraction really support that?

2)  I think batching is pretty nice.  You might be able to refactor FStream to support batching by specifying a headsize with your tail.

3)  .toList.size would behave the same as it usually does with infinite iterables (ie it would never end).  The semantics would definitely be weird, but the right way for it to work would be to just start sending Future.exceptions after a certain point.  I don't think this is necessarily the right way--you might want to convert it to a Spool if someone tries to do a "foreach"-style operation so that it will be correct.