pub fn run(&mut self) -> Result<(), Trace> {
        // println!("Starting\n{}", self.closure.lambda);
        let mut result = Ok(());

        while !self.is_terminated() {
            // println!("before: {:#?}", self.stack.stack);
            // println!("executing: {:?}", Opcode::from_byte(self.peek_byte()));
            result = self.step();
            if result.is_err() {
                break;
            }
            // println!("---");
        }
        // println!("after: {:?}", self.stack.stack);
        // println!("---");

        if let Err(mut trace) = result {
            while self.stack.unwind_frame() {
                self.unwind();
                self.ip -= 1;
                trace.add_context(self.current_span());
            }

            result = Err(trace);
        };

        return result;
    }
Suspends the current lambda and runs a new one on the Fiber.
Runs until either success, in which it restores the state of the
previous lambda, Or failure, in which it returns the runtime error.
In the future, fibers will allow for error handling -
right now, error in Passerine are practically panics.
passerine/src/vm/fiber.rs