Allow compareLength to shortcircuit in both directions

This is a more invasive alternative to the patch I offered up in bos/text#75.

This permits early termination in many inexact cases (like, you know, `stream`!) by tracking both minimum as well as maximum sizes.

This means that examples like

```haskell
>>> compareLength "hello" 6
>>> compareLength "hello" 2
```

can both execute in *O(1)*, spite the fact that `stream` has to give an inexact bound on its size. This is because it can give both an upper bound (as usual) and lower bound (words / 2) for use in the test.

In theory more combinators could be extended to make use of the lower bounds.

I tried to exhibit care to preserve sharing like the original code, but this version could definitely use a pair of eyeballs.

If it is too much trouble then by all means just take the other version. =)