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.
This also does texture coordinates and tangent-space vectors, right?  I wonder if we should just call this `compressVertices` and perhaps introduce more fine-grained per-attribute options later if needed, e.g., if someone does not want to compress texture coordinates because of artifacts.  What do you think?