Generally a connection issue causes this. Could also be the solenoid as they "stick" when dirty. Jump the terminals of the solenoid and see if it cranks instantly. If so, test for voltage at the trigger wire at the solenoid. Specifically, see if you get volts instantly to the trigger wire when you press the start button. If so, then replace the solenoid assuming it cranks instantly when you jumped the solenoid terminals.
If there are delays when jumping terminals and testing the trigger wire, then remove all main battery wires (grounds as well), clean them, put dielectric grease on them, then reinstall them.