I believe you want a delay of X milliseconds between removing a class and adding a class.  I'm not sure that you have to have the lines marked // ? or even that they do the job, but what you do have to have is a way to get the value's into the function.  Also, the setTimeout anon function might not actually need the parameters, but it should give you an idea.
$(canvas).click(function() {
    $.each(text, function(key, val) {
        $(canvas).removeAttr('class')
        var $canvas = $(canvas) //?
        var class_val = val  //?
        setTimeout(function ($canvas, class_val) {
            $canvas.addClass(class_val);
        }, 2000);
   });
});
Edit:  I'd do this instead
    function modify_element($element, class_name){
        $element.removeClass('class');
        setTimeout(function ($element) {
            $element.addClass(class_name);
        }, 1000);
        //adds the class 1 second after removing it
    }
$(canvas).click(function() {
    $.each(text, function(key, val) {
        setTimeout(modify_element($(canvas), val),2000);
        //this will loop over the elements with 2 seconds between elements
    });
});