If "locking up" the code will be an issue (which it most likely will because it almost always will) then you should not spend any more time on this implementation. To implement without delays you will have to restructure the code anyhow. I would recommend implementing with millis() for timing and a state machine.
Start looking at the following tutorials: