As important as your list, work out what paths the currents take. A good ground plane is always a good idea but also work out where other ground currents and supply currents flow. For example, if the physical path of a supply is: Source ----> load ----> CPU, and the path between source and load has high impedance or resistance, any drop along it, or interference fed in to it, will also appear at the CPU. Sometimes it is best to run an independent track to each load on the PCB, for example, from the supply input run one track to a relay and a different track to the CPU, that way there will be least interaction between them. Always use a driver transistor (bipolar or MOSFET) to drive heavy loads and remember that things like relays or LEDs do not need well regulated supply voltages so you can feed them from the source before the regulator. Using power tracks as wide as the board will allow will help minimize voltage drops.
Using mechanical relays isn't normally a problem but add a snubber diode across the relay coil as close to the relay pins as possible. Also, when inputs to a CPU are not speed critical, such as your switches, add a series resistor and a capacitor from the CPU side to ground to filter rapid changes such as interference spikes. Generally, if the inputs share the same ground as the switches or other control signals, there is no advantage to using opto isolation.
Brian.