Underlying `QEngineCPU`, `QEngineOCL`, `QStabilizer`, and `QBdt` types now check to make sure that qubit index arguments do not exceed the allocated number of qubits in a simulator. If they do, `std::invalid_argument` is raised by Qrack (and caught in the shared library C API, and re-thrown at Python level).
Historically, it turns out that the developer misunderstood C++ `const` pointer semantics, and `const pointer*` arguments have been made `pointer const*` arguments, as was originally intended. (The former is a pointer that is itself constant, as opposed to the latter meaning a pointer to memory that will not be modified.)
A redundant call to check probability in `TrySeparate()` was also removed, which increases performance.
(`QBdt` debugging is still underway, though use cases that _don't_ mix quantum binary decision tree qubits with ket qubits under `QBdt` might already work, as either fully "QBDT" qubits or fully ket qubits.)