Combine interactive and noninteractive operations in one operator - modal / invoke - how to handle?

Here is a simplified version of the addon I’m working on:

import bpy
import numpy as np

#######################################################
def get_oa():
    bpy.context.view_layer.update()
    layer = bpy.context.view_layer
    layer.update()
    oa = bpy.context.active_object
    return oa

def get_basics():
    oa = get_oa()
    def get_ix(oa):
        count = len(oa.data.vertices)
        ix = np.empty(count, dtype=np.int32) # check dtype!!!
        oa.data.vertices.foreach_get("index", ix)
        return ix,count

    def get_sl(oa):
        count = len(oa.data.vertices)
        sl = np.zeros(count, dtype=np.bool)    
        oa.data.vertices.foreach_get("select", sl)
        return sl

    def basics(oa):
        ix,count = get_ix(oa)
        slB = get_sl(oa)
        sl = ix[slB]
        return count,sl

    count,sl = basics(oa)
    return count,sl

################## base vtx ######################
def go_left():
    count,sl = get_basics()
    if sl != 0:
        sl = np.subtract(sl, 1)
    else:
        sl = count - 1
    return count,sl

################## select vtx #####################
def slct_trgt(count,sl):

    oa = get_oa()
    setSl = np.zeros(count, dtype=np.bool)
    setSl[sl] = 1

    ## deselect all components first
    setF = np.zeros(len(oa.data.polygons), dtype=np.bool)
    setE = np.zeros(len(oa.data.edges), dtype=np.bool)
    setV = np.zeros(len(oa.data.vertices), dtype=np.bool)
    oa.data.polygons.foreach_set("select", setF.ravel())
    oa.data.edges.foreach_set("select", setE.ravel())
    oa.data.vertices.foreach_set("select", setV.ravel())
    oa.data.update()

    ## select targetVtx
    oa.data.vertices.foreach_set("select", setSl.ravel())
    oa.data.update()

################## keymap #######################
## Left Arrow 
class lKey(bpy.types.Operator):
    '''left Arrow Key'''
    bl_idname = "view_3d.print_larrow"
    bl_label = "print left arrow"
    bl_options = {'REGISTER', 'UNDO'}

    def execute(self, context):
        return self.invoke(context, None)    

    def invoke(self, context, event):
        print ("leftward")

        bpy.ops.object.mode_set(mode='OBJECT') ## update selection

        count,sl = go_left()
        slct_trgt(count,sl)

        bpy.ops.object.mode_set(mode='EDIT')

        """
        Here I want to run modal transformation of the vertex selected above.
        """

        return {'FINISHED'}

# store keymaps here to access after registration
addon_keymaps = []
wm = bpy.context.window_manager
kc = wm.keyconfigs.addon

###########################################################

def register(wm, kc):
    bpy.utils.register_class(lKey)

    if kc:
        km = kc.keymaps.new(name='3D View', space_type='VIEW_3D', region_type='WINDOW') ## Object & Edit Mode both
        kmi = km.keymap_items.new('view_3d.print_larrow', 'LEFT_ARROW', 'PRESS', ctrl=True)
        addon_keymaps.append((km, kmi))

##################################

def unregister():
    for km, kmi in addon_keymaps:
        km.keymap_items.remove(kmi)
    addon_keymaps.clear()

    bpy.utils.unregister_class(lKey)

if __name__ == "__main__":
    register(wm, kc)

This is so far the noninteractive part and works well.

What I miss is the interactive part: I want to be able to transform from ‘LEFTMOUSE’ ‘PRESS’ to ‘LEFTMOUSE’ ‘RELEASE’ everytime I changed selection. (See my comment in the operators code above.)

Here is a first attempt without the mentioned mouse-action:

class lKey(bpy.types.Operator):
    '''left Arrow Key'''
    bl_idname = "view_3d.print_larrow"
    bl_label = "print left arrow"
    bl_options = {'REGISTER', 'UNDO'}

    def modal(self, context, event):

        if self.finished:
            print("stopped")
            return {'FINISHED'}

        elif self.cancelled:
            print("cancelled")
            return {'CANCELLED'}

        if event.type in {'LEFTMOUSE'}:
            self.finished = True
            print("got", event.type, "stopping...")
            return {'PASS_THROUGH'}

        elif event.type in {'RIGHTMOUSE', 'ESC'}:
            self.cancelled = True

        return {'PASS_THROUGH'}

    def invoke(self, context, event):
        self.finished = False
        self.cancelled = False

        context.window_manager.modal_handler_add(self)

        bpy.ops.object.mode_set(mode='OBJECT') ## update selection

        count,sl = go_left()
        slct_trgt(count,sl)

        bpy.ops.object.mode_set(mode='EDIT')  

        bpy.ops.transform.translate('INVOKE_DEFAULT')

        wm = context.window_manager
        wm.modal_handler_add(self)

        return {'RUNNING_MODAL'}

# store keymaps here to access after registration
addon_keymaps = []
wm = bpy.context.window_manager
kc = wm.keyconfigs.addon

###########################################################

def register(wm, kc):
    bpy.utils.register_class(lKey)

    if kc:
        km = kc.keymaps.new(name='3D View', space_type='VIEW_3D', region_type='WINDOW') ## Object & Edit Mode both
        kmi = km.keymap_items.new('view_3d.print_larrow', 'LEFT_ARROW', 'PRESS', ctrl=True)
        addon_keymaps.append((km, kmi))

##################################

def unregister():
    for km, kmi in addon_keymaps:
        km.keymap_items.remove(kmi)
    addon_keymaps.clear()

    bpy.utils.unregister_class(lKey)

if __name__ == "__main__":
    register(wm, kc)

This let me change the selected vtx once and transform it. After confirming the translation with LMB, Blender crashes with Error: EXCEPTION_ACCESS_VIOLATION