You have the start of a proper State machine here, however your fade functions run the entire color fade in a for(;
loop.
You need to keep a colorCursor that increments one step on each call to the fade() - when the wait time has passed, and after doing all pixels call matrix.show() and return.
note also that color fades in RGB space can be weird.
it works ok if you are fading from or to black, but between two bright colors the linear interpolation can produce some values do not look correct to humans. Much better to interpolate in HSV or HCL space, but that requires converting from/to RGB, which is time consuming. Perhaps a pre-computed array might help, but would add greatly to the memory footprint of an application.
For background on this issue see: