Moved variable substitution to eval()

 * Adds support for reusing a single Expression instance whenever evaluating an unchanging expression with different values of any variable(s)
 * See testSubstitution in TestVariables.java for example usage

Here are some test results over 1,000,000 iterations:
```
testSimpleWithCaching: 0.943s
testSimpleNoCaching: 2.881s
testComplexWithCaching: 5.842s
testComplexNoCaching: 14.017s
```

Test code:
```
package com.udojava.evalex;

import static org.junit.Assert.*;
import java.math.BigDecimal;
import org.junit.Test;

public class TestRPNCache
{
	public static final int numIterations=1000000;
	public static final String simpleExpression = "a+b";
	public static final String complexExpression = "MIN(MAX(a^(1*1)+0+(b*1), a*1+b/(1+(0/1)+0)-(0^(1))), a+b)";

	@Test
	public void testSimpleWithCaching()
	{
		Expression e = new Expression(simpleExpression);
		for (int a=0, b=numIterations; a<numIterations; a++, b--)
		{
			assertEquals(
							new BigDecimal(a+b).toPlainString(),
							e.with("a", new BigDecimal(a)).and("b", new BigDecimal(b)).eval().toPlainString());
		}
	}

	@Test
	public void testSimpleNoCaching()
	{
		for (int a=0, b=numIterations; a<numIterations; a++, b--)
		{
			assertEquals(
							new BigDecimal(a+b).toPlainString(),
							new Expression(simpleExpression).with("a", new BigDecimal(a)).and("b", new BigDecimal(b)).eval().toPlainString());
		}
	}

	@Test
	public void testComplexWithCaching()
	{
		Expression e = new Expression(complexExpression);
		for (int a=0, b=numIterations; a<numIterations; a++, b--)
		{
			assertEquals(
							new BigDecimal(a+b).toPlainString(),
							e.with("a", new BigDecimal(a)).and("b", new BigDecimal(b)).eval().toPlainString());
		}
	}
	
	@Test
	public void testComplexNoCaching()
	{
		for (int a=0, b=numIterations; a<numIterations; a++, b--)
		{
			assertEquals(
							new BigDecimal(a+b).toPlainString(),
							new Expression(complexExpression).with("a", new BigDecimal(a)).and("b", new BigDecimal(b)).eval().toPlainString());
		}
	}

}
```