Thanks for posting your example code, that's always helpful. I'll try to address each point you've brought up.
Cloning RFID cards
In theory, yes it is possible to clone the data on one RFID card to another - however each card will retain its original UID - that cannot be changed. You do need to be aware however, that your school badge is MIFARE Classic 4k, and the cards we ship with the module are MIFARE Classic 1k, and so have 1/4 of the EEPROM memory. If your school badge has more than 1k of data on it, you will not be able to copy it all over.
Another issue altogether is whether or not your school badge even has data stored on it. Many RFID cards not used for public transit/fare paying don't really store data. They are used simply for their UID as a means of identification, and in cases where data is stored on the cards, it is likely that the authentication keys have been changed to protect the data on the card.
Assuming there is data on the card and you have the appropriate Auth Keys
In order to clone one card to another you will need to do it in two parts - 1) read the entire contents of one card and store it and 2) write the stored data on to the second card.
Now the important thing to understand about reading/writing data on MIFARE Classic is that you need to authenticate each and every block of memory you want to read/write, and the permissions of that block need to allow reading and/or writing, depending on which you want to do. So in the code you posted, you'll need to authenticate each block before you try to read it.
As for addressing, it is a little more complicated than going byte-by-byte. Memory is stored in blocks, and you need to read each block by its address. Addressing is a little bit different between 4k and 1k cards and the best reference I can provide comparing them before I have time to write up a guide is this page from adafruit.
EventEmitter memory leak
This is something I've accidentally done quite often myself. It simply means you are setting too many event listeners. In this case the
.mifareClassicReadBlock() command uses an event listener internally, which does get cleared when the event completes, however your
read() calls will all have an overlapping execution period.
Hope that helps. I definitely recommend reading through the adafruit link for some background knowledge on RFID/NFC technology.