Stop a long running operator with escape?
This can be done with modal operator (you can find example here, look for 'Modal Execution'). I'm not sure about redo panel but executing some function on Redo can be done with handlers bpy.app.handlers.redo_pre or bpy.app.handlers.redo_post. Just append your cancelling function to them, like this: 

import bpy

def my_func(self, context): # must have 2 arguments (3 if called from class)
    print('Got Redo!')

bpy.app.handlers.redo_pre.append(my_func)


It will be executed on each redo. Use bpy.app.handlers.redo_pre.remove(my_func) to remove redo handler or bpy.app.handlers.redo_pre.clear() to clear all redo handlers