1. In primary school, say 5th grade, introduce them to the idea of binary arithmetic - 1s and 0s, and how a binary number system works. Also introduce them to an octal and hexadecimal system
Why? I can count the number of times I've needed this as a software engineer on two hands when counting in unary. It's not that important a concept, and it's also not difficult.
2. In secondary school, teach them boolean logic and algebra - AND, OR, NOT, NAND, NOR, XOR, XAND
3. Once they've learned about electrical circuits, particularly switches, introduce them to how voltage levels equate to those binary states, and start teaching them how the above logical operations can be simulated by electrical circuitry
Boolean logic is useful, but it is by far the simplest part of programming for people to understand. The part that students have a hard time doing, in my experience, is creating rigorously defined instructions with proper syntax, communicating code flow concepts like "do this while/until that", understanding data structures at a conceptual level, etc.
If I were trying to teach kids programming, I'd start with BASIC, then add data structures a couple of years later. Better yet, just teach them more abstractly how to give someone instructions, and teach skills that improve spatial reasoning. These will have a much bigger impact than understanding bit math or hex or boolean expression simplification.
Music classes, geocaching, and art are all more useful in terms of teaching the skills that make you a good programmer than any of the math concepts you're talking about.
4. In chemistry, once they've learned about valence electrons and the inner workings of an atom, teach them about semiconductors, starting w/ silicon, and about p-type doping and n-type doping
5. In Junior high, teach them about MOSFETs and how these transistors can be put together to create inverters, NAND, NOR and XOR gates. Maybe skip binary junction transistors and JFETs
6. In Senior year, teach them about the basic building blocks of computers - flip flops, registers, counters, ring counters, multiplexers and demultiplexers
We really don't need a large number of people working on silicon process or CPU design, and knowing how things work at that level is of almost no benefit to software engineers. It's way too low-level to matter. Even high-level CPU concepts like pipeline bubbles have at best marginal real-world utility, much less anything below that.
The number of times I have thought about flip-flops or ring counters while coding is exactly zero. The number of times I have thought about registers is exactly zero, because the compiler manages them for me, I have no control over them, and there are rarely enough registers for me to be able to meaningfully structure my code to minimize register fetches anyway, realistically, even if I could.
7. In college, start teaching them about CPUs. Maybe use something like RISC-V to teach them CPU design and architecture, as well as RISC-V assembly. On the software side, teach languages such as Fortran and C to start with. At this stage, introduce them to computers
This is the point where your ideas start being useful, IMO. But on top of that, I think everyone needs a solid OS programming class where they have to implement virtual memory and drivers. Understanding how those pieces work is useful in understanding why software behaves the way that it does, particularly where performance is involved. Add a distributed computing class to force a rigorous understanding of synchronization and performance impact.