optimisations

- initial check for BOF match
- new LimitReader and LimitReverseReader types
- respect MaxBOF and MaxEOF