This was spurred by noticing a trivial case of UB in the original code:
all one needed was an out-of-bounds index on any of several methods with tokens or segment indexes on the state to cause UB.
I took this opportunity to consolidate methods into Rust structs that verify their index before use.
Add a `WHISPER_CPP_VERSION` static that contains the version number of whisper.cpp that whisper-rs was built with. This can be useful for downstream applications for debugging and logging purposes.
This is implemented using [build script metadata](https://doc.rust-lang.org/cargo/reference/build-scripts.html#the-links-manifest-key) for whisper-rs-sys to expose the version number of whisper.cpp defined in `CMakeLists.txt` as metadata to crates that depend on it. Then whisper-rs accesses that build metadata and defines its own internal compile-time environment variable containing the same value, which is then assigned to a static variable.
It seemed better to expose this information through build metadata rather than defining a static in whisper-rs-sys directly, despite the extra indirection, so as to keep whisper-rs-sys as pure bindings.
Benchmarking showed
that they were usually at least 2.5x slower on common platforms (x86_64),
and the maintenance overhead tracking nightly wasn't worth it.