fix #7248: throw boundserror for invalid indices in ind2chr/chr2ind

Fixes #7248.  Previously, `chr2ind` and `ind2chr` performed no bounds checking for `DirectIndexString`s.  Now they throw a `BoundsError`.

Also, for other string types `chr2ind(s, i)` threw a `BoundsError` for `i` too large but silently returned the value for `i < 1`.   I don't understand why this behavior was desirable, so I changed it to throw a `BoundsError` in both cases.
In practice, it hasn't happened, but you could imagine storing a BOM, for example, and I'm sure lots of generic string code would break if `start(str) != 1` but you'll notice that in this file the code makes no assumptions about what `start(str)` is. It shouldn't be a performance hit since when the string type is known, it's generally an inlined constant.