How DWARF Works: Parsing Just Enough ELF

What is an ELF file? Why do we need it? How do we parse just enough of one to get the information we care about?