Sreich add header guards

add some include guards on nearly all public headers. it's very dangerous to not do this, and it will wreak havoc on most projects when they try to use it.

in fact, i don't know how no users caught this earlier, my project's uses witnesses the breakages quite unavoidably.