While
C_Timer.After() can't be canceled, Blizzard has a Lua-implemented extension that can,
C_Timer.NewTimer(). This returns a
ticker object with a the method
ticker:Cancel().
Note, the base
C_Timer.After() still fires, but the middleman function then decides whether or not to pass it along to your callback.