This changes DwarfContext to delegate to DwarfObj instead of having pure virtual methods.
With this DwarfContextInMemory is a trivial class that uses a new implementation of a DwarfObj which can be in a .cpp file.
This is more verbose than I was hopping for, but does allow lld to just implement a DwarfObj. Let me know if you think this is too verbose and I can subclass DwarfContext in lld instead.
Why do these all need default implementations? Guessing there's a reason they're not pure virtual? Though it seems like it'd make using this class more difficult if there are implicit contracts about which subset of operations are implemented and which ones are not?