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.
Heads up - #2214 will break this.  CC @shunter