pub fn init_telemetry(
    client: impl telemetry::TelemetryClient + Clone + Send + Sync + 'static,
    color_config: ColorConfig,
) -> Result<TelemetryHandle, Box<dyn std::error::Error>> {
    // make sure we're not already initialized
    if SENDER_INSTANCE.get().is_some() {
        debug!("telemetry already initialized");
        return Err(Box::new(Error::AlreadyInitialized()));
    }
    let config = TelemetryConfig::with_default_config_path()?;
    let (handle, sender) = init(config, client, color_config)?;
    SENDER_INSTANCE.set(sender).unwrap();
    Ok(handle)
}
Starts the `Worker` on a separate tokio thread. Returns an `TelemetrySender`
and an `TelemetryHandle`.

We have two different types because the TelemetrySender should be shared
across threads (i.e. Clone + Send), while the TelemetryHandle cannot be
shared since it contains the structs necessary to shut down the worker.
crates/turborepo-telemetry/src/lib.rs