Vectorized DateFromJulianDay and JulianDayFromDate

This should mitigate Issue #296 by vectorizing DateFromJulianDay and JulianDayFromDate.

For the vecorization of JulianDayFromDate I had to implement a case for netcdf.datetime and one for regular datetime. Since properties are used the calls to the lambda functions were very expensive when getting the information out of the netcdftime.datetime object.
I now use the _ attributes directly if a netcdf.datetime object is given. 

I also tried to change the netcdf.datetime class to not use properties but to enforce the immutability by overwriting the __ setattr __ method but this slowed down the num2date case when netcdf.datetime objects had to be created.

Issue #75 also caused some minor problems. I fixed it by adding half a second to the julian date when getting the day part and the fractional day. This works but I am not sure that we should actually go to the next day if the jd is not >= 0.5?

My development environment also runs autopep automatically so I hope you don't mind all the small added spaces around stuff.

Yes it is not ideal, here a comparison:

## when using _ attributes
```
In [1]: from netCDF4 import netcdftime

In [2]: import numpy as np

In [3]: dates = netcdftime.num2date(np.arange(300000), units="days since 1900-01-01", calendar="julian")

In [4]: %time netcdftime.date2num(dates, units="days since 1900-01-01", calendar="julian")
CPU times: user 271 ms, sys: 7.24 ms, total: 278 ms
Wall time: 269 ms
Out[4]: 
array([  0.00000000e+00,   1.00000000e+00,   2.00000000e+00, ...,
         2.99997000e+05,   2.99998000e+05,   2.99999000e+05])

In [5]: dates = netcdftime.num2date(np.arange(300000), units="days since 1900-01-01")

In [6]: %time netcdftime.date2num(dates, units="days since 1900-01-01")
CPU times: user 266 ms, sys: 2.9 ms, total: 269 ms
Wall time: 266 ms
Out[6]: 
array([  0.00000000e+00,   1.00000000e+00,   2.00000000e+00, ...,
         2.99997000e+05,   2.99998000e+05,   2.99999000e+05])
```

## when using regular attributes
```
In [1]: from netCDF4 import netcdftime

In [2]: import numpy as np

In [3]: dates = netcdftime.num2date(np.arange(300000), units="days since 1900-01-01", calendar="julian")

In [4]: %time netcdftime.date2num(dates, units="days since 1900-01-01", calendar="julian")
CPU times: user 516 ms, sys: 3.35 ms, total: 519 ms
Wall time: 517 ms
Out[4]: 
array([  0.00000000e+00,   1.00000000e+00,   2.00000000e+00, ...,
         2.99997000e+05,   2.99998000e+05,   2.99999000e+05])

In [5]: dates = netcdftime.num2date(np.arange(300000), units="days since 1900-01-01")

In [6]: %time netcdftime.date2num(dates, units="days since 1900-01-01")
CPU times: user 293 ms, sys: 10.2 ms, total: 303 ms
Wall time: 291 ms
Out[6]: 
array([  0.00000000e+00,   1.00000000e+00,   2.00000000e+00, ...,
         2.99997000e+05,   2.99998000e+05,   2.99999000e+05])

## Profiler output 
```
%prun netcdftime.date2num(dates, units="days since 1900-01-01")
         1800065 function calls in 0.863 seconds

   Ordered by: internal time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        2    0.592    0.296    0.854    0.427 netcdftime.py:120(JulianDayFromDate)
   300001    0.066    0.000    0.066    0.000 netcdftime.py:62(<lambda>)
   300001    0.044    0.000    0.044    0.000 netcdftime.py:63(<lambda>)
   300001    0.042    0.000    0.042    0.000 netcdftime.py:64(<lambda>)
   300001    0.039    0.000    0.039    0.000 netcdftime.py:66(<lambda>)
   300001    0.035    0.000    0.035    0.000 netcdftime.py:65(<lambda>)
   300001    0.031    0.000    0.031    0.000 netcdftime.py:69(<lambda>)
        6    0.006    0.001    0.006    0.001 {numpy.core.multiarray.array}
....
```
I tested this for different lengths of the time series and it seems as if approx. half the time is spent getting the properties.