I know this sounds strange at first, but before I learned assembler, I didn't really understand what was going on in the heart of the machine. If I were to introduce a programme starting from fundamentals, it would start with an easy assembler (eg Z80, 68000, PIC); this itself introduces the fundamental operations of programming, including assignment, de-referencing, LUTs, stacks, etc.
The next progression would be 'C'. This abstracts out the hardware dependency, but keeps the underlying structure.
This assists with more complex algorithm development, but also shows how the approach to programming developed from assembler.
Following that, I would move onto one of the modern 'C' successors. Personally I use C++, but maybe objective-C would be better.
It totally depends upon your purpose though.. If you want to cover UI/UX stuff, then you should think of a different approach. If you want to cover databases, that's something else again.
But in programming - IMO, the most genuinely 'useful' ideas are things like the registers and special registers that make up a CPU.