Fixed reading binary plists with objectRefSize > 2

Trying to read a rather large binary plist (1MB+) resulted in infinite recursion, causing a fatal error / memory exhaustion. The problem was that readBinaryArray() and readBinaryDict() could only handle objectRefSizes of 1 or 2, but the large file used a objectRefSize of 4.

I've fixed the problem by extracting this logic to a new method, similar to (and in the same style of) packItWithSize(), and handling the case of objectRefSize 4 (and 3, for what it's worth) properly.