Deopaque

There are tons of cases where `void *data` function arguments are used where there is absolutely no reason whatsoever to use that "opaque" scheme and only serves to allow trivial coding mistakes to pass through and confuse the maintainer. Also adds tons of stupid code where the pointer is immediately cast to whatever type was supposed to be used in the function prototype ...

I've fixed the issues I've found and reordered includes a bit to ensure that there are no header interdependencies. Useless `void *` members in menu struct are also fixed.

I've tested the build on C/C++ on Linux, C/C++ on Windows and Android (griffin case) and builds fine.