Steppers only vibrate, not rotate with I2C
In both master and slave, you have x and y declared in the broadest scope possible. Different devices, shouldn't matter. But x and y usual mean coordinates, which is not what you are trying to say - properly named variables help with understanding and maintenance.

I think your biggest issue, and one that confuses your attempts to debug, is the underlying logic. 


You have 4 independent buttons, but prioritise one button over the
other. What happens if both buttons are pressed together?
You have 2 independent motors but prioritise one after the other.
Your slave uses repeating code.
You use your slave as both a writer and  decider. In this case, your
writer is making the decisions over which motor to move and which
direction.
Your master only makes one move at a time - but you have two motors and 4 buttons, so you should be able to move both motors in one loop.
Your handler expects the number of bytes to be read but you don't use that to control your reading.
Your consecutive reading does not differentiate on where the data comes from. x could be filled with any of the button presses, and so could y.
If the event handler is doing the work, why have a blocking delay in the code?


Effectively, you are taking a random read and expecting the device to do something deterministic. Hence your jittering.

To help you debug your device, you can first clean up your code.


reconfigure your slave to send a single response each loop. You only need 4 bits, where each bit represents whether buttons 1-4 are pressed. Only 1 variable to be written.
Use your master to decipher the input. This is where you can put the safety in (e.g. if both 1&amp;2 are pressed/HIGH then ignore). This also reduces the possibility that your code is sending a forward then backwards signal.
Use your master to determine how many bytes have to be read and use this properly.


You will find your code cleaner, easier to read and easier to debug. Perhaps you will also see a way to directly slave the NANO to the UNO without i2C in the middle, simplifying your set up even more.

EDIT (additional information):


You can use the built in functions (see Arduino function reference under "Bits and Bytes") such as BitWrite/BitSet/BitClear and BitRead to set/clear the relevant bits on the variable you create (e.g. Byte ButtonStates). Note the use of Byte instead of Int
You can then use the slave to write the information and the master to read the information (Wire.write and Wire.read), you then know that each byte is complete and reflects what you intend.