Fix fiddly bits of structure and union checking
Fix fiddly bits of structure and union checking

Nested structures and unions weren't being handled correctly, especially
in initializers. Now we can check members of anonymous union members as
if they were direct members, and we can initialize nested structures.

For example, we now accept:

struct baz { int a; union { int b; int c; }; } v = { .a = 0, .b = 1 };

and

struct foo { int x; struct bar { int y; } inner; } z = { .x = 0, .inner.y = 1 };

cartazio/language-c,cartazio/language-c,cartazio/language-c