I'm trying to build a object with several items on a shared bus, but am having problems getting the ownership right. I've tried several variations, but I always end up with some combination of "error[E0515]: cannot return value referencing local variable" or "error[E0505]: cannot move out of `i2c_ref_cell` because it is borrowed". It all works inline in main(), but not when I try to own the content using an enclosing object.
Here is my current best guess at the code:
 ```rust
use core::cell::RefCell;
use embassy_stm32::{
    bind_interrupts,
    dma::NoDma,
    i2c::{Config, I2c, InterruptHandler},
    peripherals::{I2C1, PB7, PB8},
    time::khz,
};
use embassy_time::Duration;
use embedded_hal_bus::i2c::{self, RefCellDevice};
use mcp9808::MCP9808;
use tla2528::Tla2528;

bind_interrupts!(struct Irqs{
    I2C1_EV => InterruptHandler<I2C1>;
});

pub(crate) struct I2cBus2<'a> {
    adc: Tla2528<RefCellDevice<'a, I2c<'a, I2C1>>>,
    board_temp: MCP9808<RefCellDevice<'a, I2c<'a, I2C1>>>,
    i2c_ref_cell: RefCell<I2c<'a, I2C1>>,
}

impl<'a> I2cBus2<'a> {
    pub fn new(peri: I2C1, scl: PB8, sda: PB7) -> Self {
        let mut i2c_config = Config::default();
        i2c_config.transaction_timeout = Duration::from_millis(100);
        let i2c = I2c::new(peri, scl, sda, Irqs, NoDma, NoDma, khz(400), i2c_config);
        let i2c_ref_cell = RefCell::new(i2c);
        Self {
            adc: Tla2528::new(i2c::RefCellDevice::new(&i2c_ref_cell), 0b_0001_0011),
            board_temp: MCP9808::new(i2c::RefCellDevice::new(&i2c_ref_cell)),
            i2c_ref_cell,
        }
    }
}
```
Any thoughts on how to have a struct own a thing and several things that hold references to that thing? Lifetimes should all be right, since they are all owned by the same object. (Do I need to explicitly let the objects know they share the outer thing's lifetime? And, if so, how?)