Compress Primitive normals

For #1628.

Primitive normals are compressed using oct encoding and packed into floats. If the geometry has any combination of the following vertex attributes: texture coordinates, normal, tangent and binormal, they will all be packed into a single vec4 attribute.
I'm not sure that we should change the variables type like this.  I think it will confuse the optimizer - and this is a function we would like the optimizer to do well with for KML loading performance.

Same comment below.