A wrapper around a chip that implements ChipImpl.
This allows us to create and use chips without knowing their type,
but we can still downcast to the concrete type if we need to.
This function will wait for the chip to be initialized.
It will return Ok(true) if the chip initialized successfully.
It will return Ok(false) if the chip failed to initialize, but we can continue running.
- This is only possible if allow_failure is true.
An Err(..) will be returned if the chip failed to initialize and we cannot continue running the chip detection sequence.
- In the case that allow_failure is false, Ok(true) will be returned as an error.