Unfortunately there are no design docs.
The most productive approach is the one you are already doing. Feel
free to ask questions on this mailing list about why things are
written the way they are.
That said, the history of the compiler is that it was originally
written in C and based on the Inferno C compiler. Ken Thompson
modified that compiler to compile Go code, but the compiler was itself
still written in C. Several years later Russ Cox wrote a tool to
translate the C code into Go code. That Go code was naturally not
very idiomatic. A lot of it has been rewritten, but some still looks
like C code. A couple of years after that Keith Randall rewrote the
entire backend to use an SSA representation. At some point Robert
Griesemer rewrote the entire parser. Matthew Dempsky and Russ Cox
rewrote a lot of the frontend. Right now Robert Griesemer and Rob
Findley are rewriting the type checker. Many other people have
written significant components of the compiler, replacing earlier
components.
My point in providing this partial history is that many questions
about "why does the compiler work this way" have the answer "because
of the long and complicated history of the code base." It is not the
case that a group of people sat down and designed a clean and elegant
Go compiler. As far as I know nobody has ever written a Go compiler
from scratch.
Ian