Clean up preprocessor ifdefs in mono_thread_get_stack_bounds and fix the way thread stack information is retrieved on BSD

Cleaned up the heavily-nested preprocessor ifdefs. The code within the function was extremely difficult to understand because of the nested preprocessor directives, which has led to a number of avoidable configuration-related bugs. I've de-nested the ifdefs into a mostly-flat style, where we check for each platform just once and the entirety of the code for that platform falls under that single check. This improves the readability of the code and should fix the configuration-related issues on some platforms.

This code also fixes an issue where thread-stack information wasn't retrieved correctly on BSD-based systems; now the platform is detected correctly and the `pthread_attr_get_np` function used to retrieve the information.

This subsumes pull-request #553, which couldn't be merged with the current master branch due to several changes which were made to the `mono_thread_get_stack_bounds` function since that pull request was submitted. This commit also keeps the OpenBSD-related code for auditing purposes, though it may be removed later if testing shows the "generic" BSD handler works for OpenBSD.

The code in this commit is hereby released under the terms of the MIT/X11 license.