For priority, I would add a new parameter to init_move for move priority (which is 0 for all moves that doesn't have a priority) and then when you action_slate the move, add some big number times the move's priority to the speed-priority parameter. There's three places move-actions are slated: mev_battle_attack_select, mev_battle_attack_select_target, and obj_battlecontrol's step event. (There's already cases where actions are slated with higher priority, like when using a consumable item in battle, so the only thing that's missing is a bonus priority value from the move data)
For "attack heals for a percentage of damage" I would add a new side-effect type called "movespfx_LIFESTEAL" and give to those moves, special effects are handled in obj_battlecontrol's step event (search for "mvd_SIDEEFFECT_TYPE" to find where it's processed) and this is where you'd add the logic to heal the user based on how much damage the target took (the user's ID is in a_user). You can access the amount of damage dealt through n.my_dmg (the obj_damageapply created in the Damage block) though you'd probably want to save it in its own variable that's always initialized to 0 (in case the damage block gets skipped due to the move having 0 power n.my_dmg does not exist which will lead to a game crash if you try accessing it).
For multiple buffs/debuffs i would do something similar, add new side effect types for multiple buff/debuffs, and for these the mvd_SIDEEFFECT_SUBTYPE slot of the movedata would be an array:
[50, movespfx_MULTIDEBUFF, [stat_DEF,stat_RES], 1]
Applying these would be very similar to the current buff/debuff code but you loop over the "stat" value (since it's an array).
...actually, you could probably just turn the regular buff/debuff cases into loops in case an array is passed into them (use is_array to check), and avoid the extra work of having separate multibuff/debuff values.