Pre-calculation of gas cost before execution of operation

**WARNING: DON'T PULL ---- WORK-IN-PROGRESS**

CALLDATACOPY currently causes an OutOfMemoryException in block no 1984 because somebody tried to create a memory slot with an address space, the size of an Ethereum account address. This is theoretically possible in the protocol, but because of the block.gasLimit and probably also tx.gasLimit this isn't valid and shouldn't cause an issue this early on.

This code, calculates the gas necessary for an operation before actually executing it, thus throwing an OutOfGasException way before it can cause any problems for the actual node it is running on.
@nicksavers  @negedzuregal 
  didn't have time to check everything, but: 
if you do assertion , be sure you: 
1.  deal with AssertionError.
2. do >= and not 2 because the stack can be bigger, 
    here it's: assert(stack.size() >= 2);