Take things a step at a time. If you try to solve every problem at once, you'll get swamped. Even those of us who have players for more than a year still have problems to solve, but we take it step-by-incremental-step.
Making spawns the brain of a room is risky - what if it gets destroyed? When you hit higher levels, each room has 3 spawners - which is the overall controller?
I would recommend you look at creating a method that runs rooms, which in turns iterates over the relevant creeps and makes them run.
wrt your problems:
Look into the method room.find(); - this can do things like room.find(FIND_SOURCES) to gain understanding of resources.
Pathfinding is easy to do decently. Simply call creep.moveTo(target) - this wil serve you well for a long time.
Don't worry about calculating too many things, as some buildings will obselete your calculations. For example, a link can send energy between two points. Once you build these, how long it takes a harvester to travel is irrelevant.
If your calculations are complex, split tasks up. Instead of one creep doing everything, have one creep do the mining, and one creep do the transporting. You will find this simplifies many matters,
CPU is generally not an issue for early game. You start with 30CPU for one room - this is a lot!
Energy... In the early game you shouldn't worry about this. Even a bad solution will make progress, and you can watch nearby players or bigger players to see what they do to optimize.
Automation can be started easily - one method is to use unique descriptive names, where the creep can work out its job based on its name, and the spawn logic is simply controlled by checking for existence:
if (!Game.creeps[creepName]) {
// spawn creep
} else {
// run creep
}
I have creeps with this structure - for example "E29N42_harvester_0" is a creep that harvests, is controlled by room E29N42, and works on the first source in the room.
Hope this helps! You can always try #help on the slack or poke any of us bigmouths directly.