That question is actually several questions, and "control characters" addresses only a small part of it, e.g., the progress-bar for curl. More generally, these are common features of terminals (and terminal emulators).
Most of these common features are standardized in ECMA-48:
Control Functions for Coded Character Sets. However, other features are not. They are implementation-defined.
ECMA-48 refers to control functions. That includes control characters and control sequences (often referred to as escape sequences, ANSI sequences, etc).
Some control characters are used for simple operations, e.g.,
- move the cursor to the previous column on the same row
- move the cursor to the first column on the same row
- move the cursor to the next tab stop on the same row
- move the cursor to the next row (and scroll the screen if on the last row already)
The progress-bar for curl is built using these simple operations. But control characters can do only so much, no more. Control sequences do more, e.g.,
- move the cursor to any row/column on the screen
- move the cursor to any row in the same column on the screen
- move the cursor to any column in the same row on the screen
- set tab-stops at any column on the screen
- move the cursor to the previous line
- make the screen scroll up or down without moving the cursor
So much for parallels between simple/complex. Control sequences also are used to change the color of text and background, erase text from the screen, show text in reverse-video (or bold, underline, blink).
Programs that draw a reverse-video (or colored) progress-bar use control sequences.
Although control sequences can do more, they can do only specific things. Putting them together to make text-editors, installation screens (and programs that draw colored progress-bars) gets complicated. Some of that is made simpler by using libraries that know about these things. Initially, we had termcap (and a database of a few hundred types of terminal), extended to terminfo (and a database of around a thousand types of terminal).
Even with standardization, there are dozens of terminal descriptions that you could use. So we continue to use libraries for all but the most trivial of these applications. One is ncurses ("new-curses"), another is slang (technically "S-Lang").
Further reading: