Actually you're right, it could be solved in a better way. I was thinking of doing this in CartEvent:

    public function __construct(CartInterface $cart)
    {
        $cart->calculateTotal();
        $this->cart = $cart;
    }

So that no need to have another listener, and we ensure that the cart is fresh for all other listeners.