Olá André, tudo bem?
Gostaria primeiramente de endossar suas dúvidas como um todo. Acredito que este exercício merece ser refeito como todo, está gerando bastante dúvidas. Porém também é positivo pois gera interação por aqui.
Algumas considerações para adição aos seus pontos:
1) https://stackoverflow.com/questions/15300673/mysql-error-cant-update-table-in-stored-function-trigger-because-it-is-already
Neste link conseguimos ver esse questionamento perando a impossibilidade de utilizar o esquema de trigger/insert/after/update, e dentro da resposta escolhida como ideal, o que mas me fez sentido foi:
"You cannot change a table while the INSERT trigger is firing. The INSERT might do some locking which could result in a deadlock. Also, updating the table from a trigger would then cause the same trigger to fire again in an infinite recursive loop. Both of these reasons are why MySQL prevents you from doing this."
2) O uso de NEW em:
SET **NEW**.IDADE = timestampdiff(YEAR, **NEW**.DATA_NASCIMENTO, NOW())
Faz com que mesmo sendo um trigger com BEFORE, nós realizemos o acesso ao que virá a ser inserido. E é por isso que o código do exercício funciona se testado, porém apenas atualizando os NOVOS acréscimos.
3) Estou utilizando o WorkBench 8.0.23 e também presenciando problemas com o uso do DELIMITER. Após rodar pela primeira vez o código de criação do TRIGGER, o que funciona normalmente, o DELIMITER não retorna automaticamente para ";", atrapalhando muito na usabilidade do programa. Tentei procurar pela internet e há na documentação dizendo sobre utilizar "DELIMITER ;". Porém não há êxito, e nem mesmo mensagem de sucesso/erro.