The completion mechanism is actually the same as what it has always been. `completion-at-point' is Emacs's generic completion framework, and what they've done is replace all those mode-specific hatchet jobs with the more generic one. As for the electric stuff, that's the same story: every mode had its own way of doing it. I used (and still do, not migrated yet!) skeletons for my electric pairing as it did a really good job of handling all the edge cases (you're in a word, you're at a bracket already, etc.)