Initial implementation of sparse polynomials

Currently only multiplication is implemented.

### Timings

With the following patch:
```diff
diff --git a/src/tests/basic/test_poly.cpp b/src/tests/basic/test_poly.cpp
index 2fb6386..048aa78 100644
--- a/src/tests/basic/test_poly.cpp
+++ b/src/tests/basic/test_poly.cpp
@@ -54,7 +54,7 @@ void test_expand()
     RCP<Basic> y = rcp(new Symbol("y"));
     RCP<Basic> z = rcp(new Symbol("z"));
     RCP<Basic> w = rcp(new Symbol("w"));
-    RCP<Basic> i4 = rcp(new Integer(2));
+    RCP<Basic> i4 = rcp(new Integer(15));
 
     RCP<Basic> e, f1, f2, r;
 
```
the benchmark runs for:
```
$ ./test_poly 
poly_mul start
poly_mul stop
150ms
```