How are blocks verified? I see in the bitcoin wiki there is something called "script" which compiles down to some bytecode to be run by a very very basic virtual machine.
Does this mean that each block is actually just a string/array of bytes when it comes in and is processed by a node?
so a block in its "true" format would look something like [0x01, 0x04, 0x0f, 0xa1.... etc. ?

and then the node that recieves the block just puts the bytes into the interpreter to be run by the bitcoin VM?

which is correct? a block is pure bytecode or JSON? what would a bitcoincore node understand when receiving a new block?
A block consists of a header, and then a number of serialised transactions. The block header contains no script, it only contains data such as the merkle root of the transactions in the block (so the header commits to the list of transactions), nonce, version number, etc. Note that a block isn't encoded with JSON, it has its own serialisation format which you can find in most developer documentation (e.g. here)

The script is contained only inside transactions themselves, specifically to dictate the spending condition of an output. An output will have a scriptPubKey which holds the outputs script (usually of a specific form like P2PKH, P2SH) and the input when it's spent will contain a scriptSig which contains the spending script. In segregated witness transactions, the scriptSig will be empty and the script will instead be in the witness section of the transaction, but it's still the same principle. 

Block verification takes a number of steps such as validation of the proof of work, validation that the timestamp is ok, that the coinbase transaction is ok, that all the other transactions are ok, etc etc.