Recycles objects for positions.

Instead of creating a new ndict for each position on every event,
we change the values in the object that held the previous position.

The creation of new objects on each event was incurring too much
overhead.

Also, changes the containing type of the positions to be a regular
Python dict, since accessing the values inside of the ndict had
too much of a penalty.
This changes the existing behavior when a position is being accessed
when that position does not exist.
Previously, a position for that sid would be created, but with
zeroed out values (i.e. the default/starting values).
Code inside of handle_data will now have to check for existence
of a position before accessing it.

i.e., previously:

```
position = context.portfolio.positions['STOCK']
```

Would return a value of `position` as the following:
```
ndict({'sid': 'STOCK',
       'cost_basis': 0.0,
       'last_sale_price': 0.0,
       'amount': 0})
```

Now, a handle_data that accesses positions, should wrap the call
as such:
```
if 'STOCK' in context.portfolio.positions:
    position = context.portfolio.positions['STOCK']
```

or

```
try:
    position = context.portfolio.positions['STOCK']
except KeyError:
    log.info("No position held for 'STOCK'")
```
Changes the position type returned by performance module.

For improved speed, changes from ndict to a simple Python object,
since the cost of setting ndict values is too expensive for the
number of times that positions are returned.