s/Container type/Container/

Only one word is easier for parsing and also faster since that's 5 less
bytes to copy to kernel memory!
Deal with incomplete type as if they are "void"


    struct my_incomplete_type;
    struct mostly_complete {
        int itsanumber;
        char *nameOfTheNumber;
        struct my_incomplete_type *mostly_complete;

will show up as

    struct my_incomplete_type;
    struct mostly_complete {
        int itsanumber;
        char *nameOfTheNumber;
        void *mostly_complete;

which is the same thing, at least from protodump standpoint.

When reading the members of "struct mostly_complete", protodump will try
and read the definition of "struct my_incomplete_type". The problem is
that clang and gcc do not provide it, even if there is a proper
declaration of it somewhere else in your program.

This prevents protodump from trying to figure out if two types relying
on "struct my_incomplete_type" are the same when they are defined in
separate compilation units.
Error out on void-typed parameters

I'd be interested if you reader are reading an object with a function of
this kind:

    int my_func(void param1, void param2);

Something that is not allow in C.

This is also not possible to achieve in other languages, as far as I
have tested:

- zig defines anyopaque and void but doesn't allow any to appear as-is
  in a function signature,
- Rust defined std::ffi::c_void as an enum with two variants, and () and
  ! as a u0 with a typedef.
- C++, idk
- Pascal neither
- Fortran?
Run CI on alpine/latest for broader compatibility
Replace let-else statements for compatibility
Add .cargo to .gitignore
Print header on stderr
Match DWARF info address with symbol address

so that if there are multiple dwarf entries with the same name, the
correct one is selected.
Fix clippy warnings
Change yellow symbol since * refers to pointers
Show skipped symbol count
Handle functions that do not return anything

They don't have a DW_AT_type attribute
Compact header diff
public_types: Add types recursively