Taproot is often described as making Bitcoin “more programmable”.However, Bitcoin still executes the same stack-based Script VM, without loops or persistent state.Taproot increased expressiveness without changing the VM. What specific protocol changes made this possible?