RFM: mark/reset for IOStream, IOBuffer, & AsyncStream (addresses #2638)

**Edit:**

The current patch provides:

1) `mark()`,  `reset()`, `unmark()`, and `ismarked()` for `IOStream` and `IOBuffer` (and `AsyncStream` through `IOBuffer`)
2) Simple testing for `AsyncStreams`  and `IOStream`

These are loosely based on ideas from Java's BufferedReader, which allows a programmer to mark a location in an IO stream, and then seek back to that location later, even if the IO stream itself is not seekable:

```
m = mark(b::IO)  - marks a position in the wrapped IO object
reset(b::IO, m)  - resets b back to a marked position; the mark is removed
unmark(b::IO, m) - removes a mark
ismarked(b::IO)  - returns true if b is marked
```

See #2638 for further discussion.

Given that the code is identical, maybe it should be defined for `::IO`? A bit sketchy since it requires a `mark` field, but perhaps no worse than copying the code.