Sort out "isSpecialAnnotation" method logic

Remove duplicate method, include all needed annotations (seems that some of
them were forgotten in either of the two methods)
Refactor KotlinJvmBinaryClass, VirtualFileKotlinClass, etc.

VirtualFileKotlinClass now reads its header and name on creation. This is not
lazy enough and may be slower in some circumstances, but has the following
advantage: if anything is wrong in the header, a VirtualFileKotlinClass
instance will not be created at all, making it nearly impossible for the client
code to operate on invalid data causing all kinds of exceptions
Make KotlinBinaryClassCache thread-local